2

ストアド プロシージャtemp_tblで、カーソルまたは while ループに複数の列を追加したいと考えています。カーソルはすべて正常に動作します (の作成ですtemp_blが、列文字列が varchar 変数にある場合、列を追加できません。

WHILE @@FETCH_STATUS = 0
BEGIN       
SET @webadressenrow = 'Webadresse_'+CAST(@counter as nchar(10))

    ALTER TABLE IVS.tmpBus
        ADD @webadressenrow varchar(500) Null

    fetch next from cur_web into @webadressen
    SET @counter = @counter + 1
END

上記のコードは構文エラーになりますが、このコードは機能します。

WHILE @@FETCH_STATUS = 0
BEGIN       
SET @webadressenrow = 'Webadresse_'+CAST(@counter as nchar(10))

    ALTER TABLE IVS.tmpBus
     ADD SOMECOLUMNAME varchar(500) Null

    fetch next from cur_web into @webadressen
    SET @counter = @counter + 1
END

この小さな問題に対する構文のヒントを教えてもらえますか?

4

3 に答える 3

2

ステートメントをパラメーター化することはできませんがALTER TABLE、SQL を構築して次のように実行することはできます。

declare @sql nvarchar(max)
set @sql = 'create table IVS.tmpBus ( '

select
    @sql = @sql + 'Webadresse_' +
        row_number() over ( order by col ) +
        ' varchar(500) null, '
from sourceData

set @sql = substring(@sql, 1, len(@sql) - 2) + ' )'
exec @sql

ただし、セキュリティ/SQL インジェクション攻撃には注意してください。

于 2010-08-16T17:19:24.740 に答える
0

一般的に言えば、 DDLステートメント、つまりテーブルと列を定義するステートメントは、テーブル名または列名の変数を受け入れません。

ステートメントを準備することでそれを回避できる場合もありますが、準備されたDDLのサポートはすべてのデータベースエンジンで提供されているわけではありません。

次の例はSQLServer2005で機能しますが、列を動的に追加することは最適なソリューションではない可能性があることをお勧めします

DECLARE @colname1 VARCHAR(10)
DECLARE @colname2 VARCHAR(10)
DECLARE @sql VARCHAR(MAX)

SET @colname1 = 'col1'
SET @colname2 = 'col2'

SET @sql = 'CREATE TABLE temptab (' + @colname1 + ' VARCHAR(10) )'

EXEC (@sql)

INSERT INTO temptab VALUES ('COl 1')


SET @sql = 'ALTER TABLE temptab ADD ' + @colname2 + ' VARCHAR(10)'

EXEC (@sql)

INSERT INTO temptab VALUES ('Col1', 'Col2')

SELECT * FROM temptab

DROP TABLE temptab

以下の結果が得られました

col1 col2
---------- ----------
COl 1 NULL
Col1 Col2
于 2010-08-16T17:14:18.513 に答える
0

私は非最適な方法で問題を解決しました。コードは私にとって完全に機能します。私は別の欲求不満のプログラマーがこれを使用できることを願っています.

DECLARE cur_web CURSOR FOR
SELECT IVS.LG_Webadressen.Adresse FROM IVS.LG_Webadressen WHERE IVS.LG_Webadressen.FK_GID = @welche 

open cur_web /*Cursor wird geöffnet*/
fetch next from cur_web into @webadressen /*Erster Datensatz wird geholt*/

WHILE @@FETCH_STATUS = 0 /*Solange eine Datensatz vorhanden ist*/
BEGIN    
/*Spalte Adden*/
SET @webadressenrow = 'Webadresse_'+CAST(@counter as nchar(1)) /*Anhängen des     Durchlaufes an den Spaltennamen*/ 
SET @sql = 'ALTER TABLE IVS.temp_tbl ADD ' + @webadressenrow + ' VARCHAR(100)' /*Spalte adden*/
EXEC (@sql)    
/*Wert für die Webadresse wird reingeschrieben*/
SET @sql = 'UPDATE IVS.temp_tbl Set ' + @webadressenrow + ' = ''' + @webadressen + ''' WHERE GID = ' + CAST(@welche as nchar(10)) + ''
EXEC(@sql)
/*nächtser Datensatz wird geholt*/
fetch next from cur_web into @webadressen 
SET @counter = @counter + 1
END
/*Cursor zerstören und Schließen*/
CLOSE cur_web
DEALLOCATE cur_web
于 2010-08-18T07:48:03.357 に答える