我有一个名为Applications
的表,它有一个类型为datetime
的列StatusChangeDate
。我正在尝试使用动态查询来更新StatusChangeDate
。
我最初的查询如下:
DECLARE @TableName NVARCHAR(MAX) = (SELECT TOP 1 name FROM sys.Tables WHERE Name LIKE '%AuthorizedUsers_%');
DECLARE @UTCDate DATETIME = GETUTCDATE();
DECLARE @ApplicationsTableUpdateQuery NVARCHAR(100) = '
UPDATE A
SET StatusChangeDate = ' + @UTCDate + '
FROM [MyDb_1].[dbo].[Applications] A
INNER JOIN [MyDb_2].[dbo].[' + @TableName +'] A2
ON A.ApplicationId = A2.ApplicationId
'
EXEC sp_executesql @ApplicationsTableUpdateQuery
这给了我以下错误:;从字符串转换日期和/或时间时转换失败">
在我做了一些研究之后,我发现我需要将@UTCDate
变量转换为VARCHAR,我更新的查询如下:
DECLARE @ApplicationsTableUpdateQuery NVARCHAR(100) = '
UPDATE A
SET StatusChangeDate = ' + CONVERT(VARCHAR(100), @UTCDate) + '
FROM [MyDb_1].[dbo].[Applications] A
INNER JOIN [MyDb_2].[dbo].[' + @TableName +'] A2
ON A.ApplicationId = A2.ApplicationId
'
EXEC sp_executesql @ApplicationsTableUpdateQuery
但这给了我一个语法错误,上面写着:";CCD_ 6";我认为这是@UTCDate的格式,因为今天是3月19日。
我很困惑该如何解决这个问题。有人能告诉我我做错了什么,以及如何正确地做到这一点吗?
正确参数化查询并将日期时间值作为参数传递给查询,无论如何都需要连接表名,请尝试此
DECLARE @TableName NVARCHAR(MAX) = (SELECT TOP 1 name FROM sys.Tables WHERE Name LIKE '%AuthorizedUsers_%');
DECLARE @UTCDate DATETIME = GETUTCDATE();
DECLARE @ApplicationsTableUpdateQuery NVARCHAR(MAX)
= N'
UPDATE A
SET StatusChangeDate = @UTCDate
FROM [MyDb_1].[dbo].[Applications] A
INNER JOIN [MyDb_2].[dbo].' + QUOTENAME(@TableName) + N' A2
ON A.ApplicationId = A2.ApplicationId
'
EXEC sp_executesql @ApplicationsTableUpdateQuery
, N'@UTCDate DATETIME'
, @UTCDate