• ベストアンサー

SETとSELECTの違い(Transact-SQL)

お世話になります。 初歩的な質問で申し訳ありません。 T-SQLで、変数 @Str に値を代入する場合、 DECLARE @Str VARCHAR(100) SET @Str = 'TEST' -- (1) SELECT @Str 'TEST' -- (2) (1)と(2)の二通り書けるみたいですが、 どのように違うのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

「SWL Server 7.0 MSDE 完全トレーニングテキスト」という書籍に書いてありました。 "SELECT @hoge=" の書き方は SQL Server 6.5 までの書式で、SQL Server 7.0 以降は "SET @hoge=" の書き方を推奨しているようです。 ただし SELECT を使う方法も依然として大丈夫です。 個人的な意見ですが、変数への代入などは SET を使った方が読みやすいかな、と思ってます。 SELECT がやたらと出てくると見づらくて・・・

nsv1000e
質問者

お礼

私も、"SET @hoge="の書き方の方が読みやすいと思いました。ありがとうございました。

関連するQ&A

  • 【Transact-sql】 execの結果をoutputパラメータに持たせたい

    タイトルの通り、execの結果をoutputパラメータに持たせたいのですが、 どうすればご存知の方、ご教授お願いします。以下のように、count(*)の結果を持たせたいです。以下にサンプルコードを記載しました。 ---ストアドabc--- ( @aWork int output, @bWork int output, @cWork int output, @IDs varchar ) declare @Sql1 varchar(500) declare @Sql2 varchar(500) declare @Sql3 varchar(500) declare @IDs varchar(500) set = '1,2,3' set @Sql1 = 'select count(*) from a where id = ' + IDs -- @aWork = exec(@Sql1)としたい exec(@Sql1) set @Sql2 = 'select count(*) from b where id = ' + IDs -- @bWork = exec(@Sql2)としたい exec(@Sql2) set @Sql3 = 'select count(*) from c where id = ' + IDs -- @cWork = exec(@Sql3)としたい exec(@Sql3)

  • 【Transact-sql】 where条件、inのパタメータを変数に持たせる方法

    inの中の値を変数に持たせ、実行したいのですが方法がわかりません。 以下に、問題となっているsqlを記載しました。 aテーブルのIDはsmallint型で、varchar型等への型変更不可とします。 cast(ID as varchar(100)) in (@ID) 等も試してみたのですが、 '1,2,3'をin内の1データとみなしてしまっているようで、正しい結果を 返してくれませんでした。 declare @ID varchar(100) set @ID = '1,2,3' SELECT * FROM a WHERE ID in (@ID)

  • PRO*Cでテーブル名にバインド変数は使えますか?

    PRO*Cのプログラムで、テーブル名とカラム名をパラメータで 受け取って、ホスト変数(バインド変数?)に代入して、 それぞれ、SELECT文等で使用できますか? PL/SQLなら出来るでしょうか? EXEC SQL BEGIN DECLARE SECTION; varchar t_name[64]; /* テーブル名 */ varchar col_name[64]; /* カラム名 */ EXEC SQL END DECLARE SECTION; /* 中略 パラメータの値をホスト変数に代入する処理を行う */ ↓以下のように出来ますか? SELECT :col_name FROM :t_name ;

  • 変数の取り扱いについて

    はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。

  • SELECT文の結果をDEFINEの値として使用したいのですが。。。 [Oracle9i]

    こんにちは。 test.sqlでバインド変数として使用されている"hensu"に対して、SELECT文の結果を代入したいと考えています。 そこで、DEFINEで下記のようにセットしてみようとしたのですが、"hensu"には"hensu_id"という文字として入ってしまうようです。 DECLARE hensu_id number ; BEGIN select min(id) into hensu_id; END; / DEFINE hensu =hensu_id @c:\test.sql 初歩的な質問ですみませんが、宜しくお願いします。

  • SQLストアドについて

    SQL超初心者です。 ストアド内でテーブル名を可変にしたいのですが以下のようなエラーメッセージが表示され でません。どなたか教えていただけませんか? <エラーメッセージ> テーブル変数 "@AA" を宣言してください。 ◆環境  sql Sever 2005 ◆コードは以下の通りです。 DECLARE @AA VARCHAR(50) DECLARE @HANTEI CHAR(5) DECLARE @FETCHTABLE1 CHAR(22) DECLARE @FETCHTABLE2 CHAR(22) SET @HANTEI = 'ABCDEF' SET @FETCHTABLE1 = 'DBO.USV_YOSAN' SET @FETCHTABLE2 = 'DBO.USV_JISEKI' BEGIN IF @HANTEI = 'ABCEDF' SET @AA= @FETCHTABLE2 SELECT * FROM @AA PRINT @AA END 以上 よろしくお願いいたします。

  • VB2005のSQLにて定義した変数の使用について

    VB2005、DBはSqlserver2005 についてです。 以下のようなSQLにて変数に値を設定して、フォーム上のテキストボックスにその値を 表示させたいのですが、うまくいきません。 どうしたらよいかアドバイス頂けると助かります。 <SQL> command.CommandText = "BEGIN DECLARE @SQL-todoufuken_code VARCHAR(20) " & _ "SET @SQL-todoufuken_code = (SELECT MAX(todoufuken_code) FROM tbl_todoufuken)" & _ "END" <テキストボックスへの設定> txtTodoufuken_code.Text = @SQL-todoufuken_code

  • ODBC SQLサーバーでSQLを使いたい・・・

    ODBC SQLサーバーでSQLを使いたい・・・ SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @CUNT INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATANAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = "金曜" BREAK ELSE SELECT @CUNT = @CUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112) SELECT @EDATE 実行日からさかのぼり、金曜日の日付を表示したいSQLを作成しています。 なぜか"金曜"がおかしいとエラーが出てしまいます。 どなたかわかる方いましたらご教授お願い致します。

  • 【PL/SQL】SQL文が長すぎてSELECTできない

    oracle9iのpl/sqlでSELECT文を発行し 取得したカーソルを返す処理をしています。 where句が動的になる為 実行するSQL文が長くなり ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました のエラーが発生します。 そこで、SQL文の部分をCLOB型にしたり SQL文を「||」でつなげたり してみましたが、どちらもエラーになりました。 長すぎるSQL文を実行するには どうしたらよいでしょうか? 以下ソースです。(左側の数字は行数です) ----------------------------------- 1 PROCEDURE テスト(O_カーソル IN OUT 情報カーソル) IS 2 TYPE curType IS REF CURSOR; 3 tmpCur curType; 4 sqlStr VARCHAR2(32767); 5 6 7 BEGIN 8 9 sqlStr := 'SELECT ' 10 sqlStr := sqlStr || 'A,B ' 11 sqlStr := sqlStr || 'FROM' <<省略>> 12 OPEN tmpCur FOR sqlStr ←エラー発生 13 O_カーソル := tmpCur; --取得したカーソルを返す 14 END テスト; ----------------------------------- (1)SQL文をCLOB型にしてみる:コンパイルエラー 4 sqlStr CLOB (2)SQL文を「||」でつなげてみる:文字列バッファが小さすぎますでエラー Dim sqlStr1 VARCHAR2(32767); Dim sqlStr2 VARCHAR2(32767); Dim sqlStr3 VARCHAR2(32767); <<省略>> 12 OPEN tmpCur FOR (sqlStr1      || sqlStr2      || sqlStr3 <<省略>> )

  • バインド変数について

    PL/SQLのバインド変数について調べていますが理解できず困っています。 [理解内容] 1.利点  :SQL文の検索にバインド変数を利用すると、同一のSQLとして実行できる   ⇒ 繰り返し処理(ループ)では有効 2.使用方法  :静的SQL・動的SQLで使用可能   [疑問点]   静的SQLではバインド変数をどう宣言すればよいですか?   [SQL*Plus]・[動的SQL]は例文がありました   ●SQL*Plusでの宣言方法    (例)     SQL> set null '<null>'     SQL> set head off     SQL> variable var_at_sqlplus number   ●動的SQLの記述方法    (例)     declare      v_sql varchar2(256);      v_id varchar2(3);     begin      v_sql = 'select id into :v_id from test';      execute immediate v_sql into v_id;     end;   ●静的SQL ・・・【 エラーになる 】     declare      variable v_id varchar2(3);     begin      select id into :v_id from test'     end; どんな事でもかまいませんので回答よろしくお願いします