我需要生成多更新语句。
这段代码:
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;
我不知道如何自动执行它们。我不得不复制它们并手动执行,但这不是我的观点。
首先,您的更新语句使您看起来有不同的表描述相同的数据实体。这是一个糟糕的数据库设计,如果可能的话应该重构。
所有这些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
行。
你不需要在@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);