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