質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1292閲覧

T-SQLの変数について

AGadget

総合スコア60

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/04/29 22:51

T-SQLでストアドプロシージャを組むことになったのですが(おそらく)初歩的なところで躓いております。
社内のクエリや、ネット上に挙がっているクエリを参考に作っているのですが、どうにも上手く動きません。

それぞれ質問内容が異なりますがT-SQLの変数の取り扱いについて質問させてください。

1点目。
SELECT句で列名を指定するのではなく、変数に列名を代入して、その変数を指定すれば同じ結果が得られると思ったのですが、どうにも思い通りに動きません。
クエリ自体は正常に実行されるのですが空のレコードだけが抽出されてしまいます。
これはT-SQLの仕様なのでしょうか。

SQL

1/* 空のレコードが出力されてしまう */ 2DECLARE 3 @No = 'No', 4 @Name = '商品名', 5 @Price = '値段' 6SELECT 7 @No, 8 @Name, 9 @Price 10FROM 11 商品マスタテーブル 12GO

2点目。
2つのテーブルを比較して検出された件数を変数に代入しようとしたのですが、1回目は「コマンドは正常に完了しました。」というメッセージが出力され、2回目からは「データベースに '※変数名' という名前のオブジェクトが既に存在します。」というエラーが吐かれて使えなくなってしまいました。
どのような理由から、そうなってしまうのかも分かっていないのですが、何よりも直し方も分からないので非常に困っております。

SQL

1-- 初実行時「コマンドは正常に完了しました。」 2-- 2度目以降「データベースに '※変数名' という名前のオブジェクトが既に存在します。」 3DECLARE 4 @inconsistency INT 5SELECT 6 COUNT(Table_1.No) INTO inconsistency 7FROM 8 Table_1 INNER JOIN Table_2 ON 9 Table_1.No = Table_2.No AND 10 Table_1.商品名 = Table_2.商品名 AND 11 Table_1.値段 = Table_2.値段 12WHERE 13 Table_1.注文日 IS NULL AND 14 Table_2.注文日 IS NOT NULL 15GO

長くなりましたが、ご回答のほど、よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1点目。
クエリ自体は正常に実行されるのですが空のレコードだけが抽出されてしまいます。

実際に発行されているSQLは

SQL

1SELECT 'No', '商品名', '値段' FROM 商品マスタテーブル

のはずです。少なくともではなさそうですが。

select項目を動的にしたいなら動的にSQLを組み立てる必要があります。

TSQL

1DECLARE 2 @No = 'No', 3 @Name = '商品名', 4 @Price = '値段' 5 @sSQL NVARCHAR(200) 6 7SET @sSQL = N'select ' + @No + ', ' + @Name + ', ' + @Price + ' from 商品マスタテーブル' 8EXECUTE (@sSQL)

参考:SQL Serverで動的に生成したSQLを実行する

2点目。

変数への代入になってないから

TSQL

1SELECT 2 @inconsistency = COUNT(Table_1.No)

投稿2019/04/30 01:13

編集2019/04/30 01:36
sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/04/30 01:27

2つ目は既にinconsistencyが作られているので、消しておきましょう。
AGadget

2019/04/30 06:30

ご回答ありがとうございます! // 実際に発行されているSQLは... そうなんですよね。 私もそのような処理(?)がされるはずだと思うのですが、どういう訳か空の結果が返ってくるんですよね……。 おそらく、私が何か根本的なところを見落としているのが原因だと思います。 // 変数への代入になってないから ありがとうございます! 変数への代入方法がよく分からなかったので助かりました。
guest

0

1点目は「商品マスタテーブル」が空なのでは?from句を書く必要性が感じられません。

sql

1SELECT 2 @No, 3 @Name, 4 @Price

2点目はinto句の使い方の問題だと思います。
intoは指定されたテーブル名が存在しなければそのテーブル名でcreateして
「そのテーブルに行を挿入する」という動作なのでそもそも間違いです。
setとかで内容を代入でいいと思います。

sql

1DECLARE 2 @inconsistency INT 3 4set @inconsistency= 5(SELECT 6 COUNT(Table_1.No) --INTO inconsistency 7FROM 8 Table_1 INNER JOIN Table_2 ON 9 Table_1.No = Table_2.No AND 10 Table_1.商品名 = Table_2.商品名 AND 11 Table_1.値段 = Table_2.値段 12WHERE 13 Table_1.注文日 IS NULL AND 14 Table_2.注文日 IS NOT NULL)

投稿2019/04/30 01:04

編集2019/04/30 01:24
sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/04/30 01:42 編集

(説明を求められても答えられそうになかったのでコメント削除しました。)
AGadget

2019/04/30 06:18

ご回答ありがとうございます! // 1点目は「商品マスタテーブル」が空なのでは? いえ、空ではないのです。 空ではないからこそ、尚のこと原因が分からなくって……。 // 2点目はinto句の使い方の問題だと思います。 ありがとうございます! こういう変数の書き方もあるのですね。 変数の使い方全般について勉強不足でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問