如何在SQL Server中使用动态查询正确更新dateTime值



我有一个名为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 

最新更新