我需要生成多重更新语句。
此代码:
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 :(得分:2)
首先,您的更新语句使您看起来有不同的表描述相同的数据实体。这是一个糟糕的数据库设计,如果可能的话应该重构
所有这些V_ + IdStr
表应该是一个表,其中IdStr
只是另一列。
假设无法做到这一点,我相信其余的答案就是你要找的:
将@query
变量改为nvarchar(max)
而不是varchar(max)
,并使用sp_executeSql
将更新语句作为输出变量。
添加一个变量以将查询结果连接到(我在我的示例中称之为@statements
,注意带有Added this!
注释的行:
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', @statemets=@Update OUTPUT
PRINT @Update
--EXECUTE sp_executesql @Update
一旦您看到@Update
变量包含正确的更新语句,请删除Print
行并取消注释Execute
行。
答案 1 :(得分:1)
你不需要在@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))))
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);