• 締切済み

TranzactSQL文 文字列変数同士の連結

文字列変数の連結について質問いたします。 通常以下の場合、結果は望んだとおりになります。 ----------------------------------------------- SET @会社=N'A社' SET @別会社=N'B社' SET @結果=@会社+'、"+@別会社 SELECT @結果 ’A社、B社' ---------------------------------------------- 以下のように記述にして,複数会社名を連結させる目的で FETCHを使用して変数に値を格納しようとしていますが 結果NULLが返されるのはなぜでしょうか。 ---------------------------------------------- DECLARE myCursor CURSOR FOR SELECT 会社名 FROM 会社マスター OPEN myCursor FETCH NEXT FROM myCursor INTO @会社名 WHILE @@FETCH_STATUS=0 BEGIN     @結果=@結果+@会社名    FETCH NEXT FROM myCursor    INTO @会社名 END CLOSE myCursor DEALLOCATE myCursor SELECT @結果

みんなの回答

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

>結果NULLが返されるのはなぜでしょうか @結果=@結果+@会社名 最初の@結果か、いずれかのレコードの@会社名に Nullが1つでもあれば、Nullになりますが。 @結果= 'ABC' + null は、 @結果がnullになります。

Maeyati
質問者

お礼

回答ありがとうございます。 解決しました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

BEGINの前で、@結果を初期化しなくて良いのかな?

Maeyati
質問者

お礼

回答ありがとうございます。 以下のステップを踏むと変数は初期化されるようです。 FETCH NEXT FROM myCursor INTO @会社名 妥協策として、プロシージャに テーブル変数にフィールドを1個作り、それを 格納場所として値を出し入れしております。

関連するQ&A

  • 文字列の連結

    文字列の連結 select * from test where testcolum=変数名 といった感じで、文字列と変数を連結したいのですがやり方がわかりません。 declare cdata varchar2(20); begin cdata:='sample'; 'select * from test where testcolum=' || cdata; end; 上のように、select文を動的に変更して実行したいのです。 よろしくお願いします。 /

  • 過去の質問を見て分からなかったSQL文があります

    お世話になります。 過去の質問の中で、文法が分からないものがあったので、教えてください。 [QNo.1118130] 全テーブルのデータの行数 という質問の中のNo.1の方の回答で次のようなSQL文がありました。 -------------------------------------------------------------------------------------- DECLARE @name nvarchar(30) DECLARE @sql nvarchar(200) DECLARE TCUR CURSOR FOR SELECT name FROM sysobjects WHERE type = 'U' OPEN TCUR FETCH NEXT FROM TCUR INTO @name -----・・・(1) WHILE (@@fetch_status <> -1) BEGIN SET @sql = 'SELECT count(*),''' + @name + ''' AS TNAME FROM '+ @name -----・・・(2) EXEC(@sql) FETCH NEXT FROM TCUR INTO @name -----・・・(3) END CLOSE TCUR DEALLOCATE TCUR -------------------------------------------------------------------------------------- (1)の部分について  "INTO @name"の部分で、@name には何を入れているのでしょうか? (2)の部分について  最初の 'SELECT count(*),'の部分は分かるのですが、これ以降で"'(シングルクォーテーション)"が沢山あって、何を囲っているのか分かりませんでした。  ("'"が多用されていて分かりませんでした) (3)の部分について  (1)と全く同じ文ですが、(1)と(3)でやっていることは違うのでしょうか。 すみませんが、アドバイスお願いします。

  • 文字列を連結した後に1つの変数として定義したい

    OpDate1、OpDate2・・・というように変数にデータを割り当てていたとき、テーブル(tbl_Option)に先ほどのデータを変数として更新クエリとして処理を行いたいのですが、文字列の連結後を1つの変数とした場合の定義の仕方がわかりません。ご教授をお願いします。 OpDate1 = #10/10/2013# OpDate2 = #11/10/2013# OpDate3 = #12/10/2013# Set DBH = CurrentDb() sql = " SELECT tbl_Option.* FROM tbl_Option;" Set rs = DBH.OpenRecordset(sql) If rs.RecordCount <> 0 Then rs.MoveLast rs.MoveFirst For iintLoop = 1 To rs.RecordCount With rs Set DBH2 = CurrentDb() →→ sql2 = " UPDATE tbl_Option SET tbl_Option.試用期限 = #" & "OpDate" & iintLoop & "#" _ & " WHERE (((tbl_Option.処理番号)=" & iintLoop & "));" DBH2.Execute sql2 .MoveNext End With Next iintLoop End If

  • スラッシュ"/"で始まるテーブル名も、sp_spaceusedのループ処理に取り込みたい

    お世話になります。はまってしまい、お知恵を貸して下さい。 SQL Server2000環境です。 データの月ごとの増加量が、想定よりも多いので、 各テーブルのサイズを出し、それをたし合わせることで、実際にテーブルが占める分を計算したいです。 下記の質問の答えを参考に、ストアドプロシージャにして実行しました。 http://okwave.jp/qa3291219.html ******************************************** declare cur cursor for select [name] from dbo.sysobjects where xtype='U'; declare @tableName nvarchar(1552) open cur; fetch next from cur into @tableName; WHILE @@FETCH_STATUS = 0 BEGIN exec('sp_spaceused ' + @tableName) FETCH NEXT FROM cur into @tableName; END; CLOSE cur; DEALLOCATE cur; ****************************************** ほとんどのテーブルについては、答えが得られるのですが、 スラッシュ始まりのテーブルは、構文エラーになってしまいます。 スラッシュ始まりのテーブルが100個近くあり、(/BDL/MSGLOG など) 出切ればループ処理に組み込みたいです。 スラッシュ始まりのテーブル1つに対しては、 'sp_spaceused' + '[テーブル名]' と、大カッコ・シングルクォーテーションで囲めば、テーブル名として処理できたのですが。。 スラッシュ始まりのテーブルについても、FETCHで一行ずつ処理してくれるようにするには、 どうしたらいいでしょうか? すみませんが、よろしくお願いします。

  • 複数レコードを1変数にセットするには

    以下、ご回答、よろしくお願いします。 ストプロで、カーソルに格納したレコードを、1変数にセットしたく思います。 (この変数を本文にして、メールをはき出します。) AccessVBAでは -------------------------- Do Until rs.EOF   strBody = strBody & rs!受注コード & ":" & rs!明細コード & vbCrLf   rs.MoveNext Loop -------------------------- とするところを、sqlのストプロで -------------------------- WHILE @@FETCH_STATUS = 0 BEGIN  select @strBody = (@受注コード + @明細コード) + char(13) + char(10)  FETCH NEXT FROM cur_cust  INTO @受注コード, @明細コード end -------------------------- 等としても、1レコード分のデータしか渡りません。(あたり前ですね。) 現在に手詰まりの状態です。 ご教授、よろしくお願いします。

  • PL/SQLでテーブル名に変数を使いたい

    下記のようにV_TABLE_NAMEに不定のテーブル名で使用したい ご存知の方は教えて頂けないでしょうか?V_TABLE_NAMEに取得したテーブルをセットし、データの件数を取得するPL/SQL CURSOR C_CUR IS SELECT COUNT (*) FROM V_TABLE_NAME; BEGIN for ・・・・・ loop ・・・  ・・・ V_TABLE_NAME := GET_TABLE;  OPEN C_CUR;  FETCH C_CUR into w_count; CLOSE C_CUR; end loop;

  • SELECT文の結果を変数に・・・

    C#でOracleデータベースへ接続して データーベースにある全てのテーブル名を取得したいのですが、取得した一覧を変数にする方法が分かりません。 SQL文「SELECT * FROM TAB」で一覧を取得することはわかったのですが、この結果を変数に格納することができません。 何か方法をご存知のかたが居られましたらご教授願えないでしょうか?

  • PL/SQL での[CURSOR]の記述について

    CURSORを使用する際に、以下のようなことが実現できるものか分からないもので、 ご質問させていただきました。 以下のような記述で、where条件を別の変数(wk_where)に格納しておいて、 それを連結させることが可能なのかお教えいただきたいです。 もしも可能であればどのように連結させるのでしょうか? CURSOR cur出力データ IS SELECT AAA, BBB FROM AAAテーブル ; イメージとしては以下のように考えていました。 CURSOR cur出力データ IS SELECT AAA, BBB FROM AAAテーブル & wk_where ; 以上ですが、宜しくおねがいいたします。

  • Oracleでの文字列連結サイズの上限

    Oracle9iでテーブル内容をスプール出力していますが、カラム単位で余白を削除したい (トリムをかけたい)ので以下のようにカラムを連結させてスプールしています。 set colsep ',' spool test.csv select a ||','|| b ||','|| c from test_table spool off 実際の項目数は100以上あり、レコードの最大長も数千バイトになりますが、 各項目にMAXの値を入力して上記スプールを実行したところ、以下のエラーメッセージが 出力されました。 「ORA-01489: 文字列を連結した結果、長さが最大長を超えました」 データを連結した結果の長さが上限を超えたということなのでしょうが、 この最大長はどこで設定されているものなのでしょうか? また、そもそもスプール出力でトリムが効かないためにこのようなやり方で 出力していますが、他によい方法をご存知の方いましたら教えて下さい。 よろしくお願いします。

  • 変数が選択リストにありません

    変数が選択リストにありません 下記のコードを実行すると「変数が選択リストにありません」というエラーが出てしまいます。 SELECT文とFETCHのINTOの変数の個数が一致していない場合にこのエラーは出るということらしいのですが、問題ないように思うのです。 下記コードで何が問題になっているのか教えてください。 よろしくお願いします。 set serveroutput on; declare -- 各テーブルの全カラムを取得 cursor curcol (p_tblname user_tables.table_name%type) is select COLUMN_NAME,DATA_TYPE from user_tab_columns where table_name = p_tblname ; v_sql varchar2(1000); -- SQL文 v_col varchar2(1000); -- カラム名 v_val varchar2(1000); -- 取得データ v_tblname varchar2(20); -- テーブル名 v_RstExec integer; v_CursorID integer; begin v_col := ''; v_tblname := 'sample'; -- 取得テーブルのカラムを取得 for rowcol in curcol(v_tblname) loop -- 取得カラムをCSV形式に変換 if v_col is null then v_col := rowcol.COLUMN_NAME; else v_col := v_col||'||'',''||'||rowcol.COLUMN_NAME; end if; end loop; dbms_output.put_line(v_col); -- SQL作成 v_sql := 'select '||v_col||' from '||v_tblname; v_CursorID := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.NATIVE); v_RstExec := DBMS_SQL.EXECUTE(v_CursorID); LOOP IF DBMS_SQL.FETCH_ROWS(v_CursorID) = 0 THEN EXIT; END IF; DBMS_SQL.COLUMN_VALUE(v_CursorID, 1, v_val); DBMS_OUTPUT.PUT_LINE(v_val); END LOOP; DBMS_SQL.CLOSE_CURSOR(v_CursorID); end; /