如何在 SQL 服务器中使用动态查询正确更新日期时间值

How to properly update a dateTime value using a dynamic query in SQL Server

我有一个名为 Applications 的 table,它有一个名为 StatusChangeDate 的列,类型为 datetime。我正在尝试使用动态查询来更新 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

这给了我以下错误:“从字符串转换日期 and/or 时间时转换失败。”

经过一些研究,我发现我需要将我的 @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

但这给了我一个语法错误:“Incorrect syntax near '19'”我认为这是 @UTCDate 的格式,因为今天是 3 月 19 日。

我对如何解决这个问题感到困惑。有人可以阐明我做错了什么以及如何正确地做到这一点吗?

正确地参数化您的查询并将日期时间值作为参数传递给查询,无论如何您都需要连接 table 名称,试试这个

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