2017-12-19 18 views
1

複数の更新文を生成する必要があります。複数のUPDATE文を生成して実行する

このコード:

DECLARE @query as varchar(max); 
SET @query = 

'declare @data_dzis as nvarchar(10) 
declare @data_wczoraj as nvarchar(10) 
SELECT @data_dzis=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE())))) 
SELECT @data_wczoraj=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1)))) 

    Select 
     ''update V_''+IdStr + '' set start='' + @data_wczoraj + '' where DataVersionId=0 and start='' + @data_dzis +'';'' 
    FROM [KW_GRECOS].[dbo].[Variable] 
    where Granularity=0 and IdStr<>''_ROOT_FOLDER_''' 

exec(@query); 

...レコードセットとしてアップデートのリストを生成します。

update V_G012 set start=43085 where DataVersionId=0 and start=43086; 
update V_G059 set start=43085 where DataVersionId=0 and start=43086; 
update V_G002a set start=43085 where DataVersionId=0 and start=43086; 
update V_G0122 set start=43085 where DataVersionId=0 and start=43086; 
update V_103D set start=43085 where DataVersionId=0 and start=43086; 
update V_G072 set start=43085 where DataVersionId=0 and start=43086; 
update V_G201 set start=43085 where DataVersionId=0 and start=43086; 
update V_G001a set start=43085 where DataVersionId=0 and start=43086; 
update V_G067a set start=43085 where DataVersionId=0 and start=43086; 

私はそれらを自動的に実行する方法がわかりません。 私はそれらをコピーして手動で実行する必要がありましたが、それは私の問題ではありません。

+0

をテストしていない@queryにすべてのことをする必要はありません[動的SQL-EXEC(@SQL)とEXEC SP \ _EXECUTESQL(@SQL)]の複製(https://stackoverflow.com/questions/548090/dynamic-sql-execsql-versus-exec-sp-executesqlsql) –

+0

エラーが出ていますか?エラーがない場合はどのような問題? – Paparazzi

答えて

2

最初に、更新ステートメントは、同じデータエンティティを記述する別のテーブルがあるように見えます。これは悪いデータベース設計であり、可能であればリファクタリングする必要があります。
これらのテーブルはすべて単一のテーブルである必要があります。IdStrは内部の別の列です。代わりにvarchar(max)nvarchar(max)にご@query変数を変更し、出力として更新ステートメントを取得するためにsp_executeSqlを使用

これを行うことができないと仮定すると、私は私の答えの残りの部分はあなたが探しているものであると信じて変数。
Added this!コメントと行に注意私は、私の例では、それ@statements呼ばれました)にクエリ結果を連結するための変数を追加します:あなたは@Update変数が正しい更新文が含まれていることがわかりたら

DECLARE @query as nvarchar(max), 
     @Update nvarchar(max); 

SET @query = 

'declare @data_dzis as nvarchar(10) 
declare @data_wczoraj as nvarchar(10) 
SELECT @data_dzis=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE())))) 
SELECT @data_wczoraj=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1)))) 
Set @statemets = ''''; -- Added this! 
Select @statemets += -- Added this! 
     ''update V_''+IdStr + '' set start='' + @data_wczoraj + '' where DataVersionId=0 and start='' + @data_dzis +'';'' 
    FROM [KW_GRECOS].[dbo].[Variable] 
    where Granularity=0 and IdStr<>''_ROOT_FOLDER_''' 

EXECUTE sp_executesql @query, N'@statemets nvarchar(max) OUTPUT', @[email protected] OUTPUT 

PRINT @Update 
--EXECUTE sp_executesql @Update 

Print行を削除し、Execute行のコメントを外します。

See a simplified live demo on rextester.

1

あなたは
それは、動的SQLのチュートリアルを必要に帰着するので、これも同様かもしれない

declare @data_dzis as nvarchar(10) 
declare @data_wczoraj as nvarchar(10) 
SELECT @data_dzis = convert(varchar,convert(int,convert(datetime,convert(date,GETDATE())))) 
SELECT @data_wczoraj = convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1)))) 

DECLARE @query as nvarchar(max); 
SET @query = 'Select ''update V_''+ IdStr + '' set start='' + @data_wczoraj + 
      '' where DataVersionId=0 and start='' + @data_dzis +'';'' 
      FROM [KW_GRECOS].[dbo].[Variable] 
      where Granularity=0 and IdStr<>''_ROOT_FOLDER_''' 

exec(@query); 
+0

あなたの観察が正しい間、質問に答えません。また、 ''選択 'の前に '''を忘れた。 –

関連する問題