添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我有一个名为 Applications 的表,它有一个名为 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

这给了我以下错误。"从字符串转换日期和/或时间时,转换失败"。

在我做了一些研究之后,我发现我需要将@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日。

我对如何解决这个问题感到困惑。谁能告诉我,我做错了什么,如何正确地做到这一点?

4 个评论
你需要把它作为一个适当的参数来传递。SET @sql = N'UPDATE … SET col = @param …'; EXEC sys.sp_executesql @sql, N'@param datetime', @param;';除非必要,你不应该在你的SQL中连接参数,而且你应该在对象名称周围使用QUOTENAME(),而不是自己添加方括号。这就是SQL注入发生的原因。见sqlblog.org/dynamic-sql
@AaronBertrand 你能把查询写在答案中吗,这样可能更容易阅读和理解,谢谢。我仍然是SQL方面的新手,这将会很有帮助。
SMor
@HussamAhmed "刚接触SQL的人 "可能不应该尝试使用动态SQL。不管怎么说,你不能调试你看不到的东西。你需要看一下你生成的语句,以了解执行时发生的任何错误。最有可能的是,你会看到一个明显的问题--你需要用单引号来包装你转换的日期时间常数。但为什么要这样做呢?只要在语句中直接使用GetUTCDate函数设置该列即可。为什么要设置一个变量,然后在语句中嵌入/传递这个变量?
SMor
而且,你已经学会了一些坏习惯。随着时间的推移,这些只会使编写/使用SQL更加困难。
sql
sql-server
tsql
Hussam Ahmed
Hussam Ahmed
发布于 2022-03-20
1 个回答
M.Ali
M.Ali
发布于 2022-03-20
已采纳
0 人赞同

正确地设置查询参数,并将数据时间值作为参数传递给查询,无论如何你都需要将表名连接起来,请尝试这样做

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