Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server查询中的动态表名和变量名_Sql_Sql Server_Tsql_Dynamicquery - Fatal编程技术网

SQL Server查询中的动态表名和变量名

SQL Server查询中的动态表名和变量名,sql,sql-server,tsql,dynamicquery,Sql,Sql Server,Tsql,Dynamicquery,我正在尝试使用动态表名和日期从Python运行一个查询。在此过程中,我在SSMS中尝试了以下查询,但它产生了一条错误消息。如何使用变量作为表名和日期,并使查询正常工作 DECLARE @table_name VARCHAR(50)='table_name'; DECLARE @valid_to datetime = getdate(); EXEC('UPDATE '+ @table_name + ' SET valid_flag = 0, valid_to = '+ @valid_to +'

我正在尝试使用动态表名和日期从Python运行一个查询。在此过程中,我在SSMS中尝试了以下查询,但它产生了一条错误消息。如何使用变量作为表名和日期,并使查询正常工作

DECLARE @table_name VARCHAR(50)='table_name';
DECLARE @valid_to datetime = getdate();

EXEC('UPDATE '+ @table_name + '
SET valid_flag = 0, 
valid_to = '+ @valid_to +'
where valid_flag=1')
我收到以下错误消息:

味精102,第15级,状态1,第3行
“10”附近的语法不正确


使用
sp_executesql
和参数:

DECLARE @table_name VARCHAR(50) = 'table_name';
DECLARE @valid_to datetime = getdate();

DECLARE @sql NVARCHAR(max) = N'
UPDATE '+ @table_name + N'
    SET valid_flag = 0, 
        valid_to = @valid_to
    WHERE valid_flag = 1
';

EXEC sp_executesql @sql, N'@valid_to datetime', @valid_to=@valid_to;
编辑:

根据Larnu的建议,评论如下:

DECLARE @table_name sysname = 'table_name';
DECLARE @valid_to datetime = getdate();

DECLARE @sql NVARCHAR(max) = N'
UPDATE '+ QUOTENAME(@table_name) + N'
    SET valid_flag = 0, 
        valid_to = @valid_to
    WHERE valid_flag = 1
';

EXEC sp_executesql @sql, N'@valid_to datetime', @valid_to=@valid_to;

使用
sp_executesql
和参数:

DECLARE @table_name VARCHAR(50) = 'table_name';
DECLARE @valid_to datetime = getdate();

DECLARE @sql NVARCHAR(max) = N'
UPDATE '+ @table_name + N'
    SET valid_flag = 0, 
        valid_to = @valid_to
    WHERE valid_flag = 1
';

EXEC sp_executesql @sql, N'@valid_to datetime', @valid_to=@valid_to;
编辑:

根据Larnu的建议,评论如下:

DECLARE @table_name sysname = 'table_name';
DECLARE @valid_to datetime = getdate();

DECLARE @sql NVARCHAR(max) = N'
UPDATE '+ QUOTENAME(@table_name) + N'
    SET valid_flag = 0, 
        valid_to = @valid_to
    WHERE valid_flag = 1
';

EXEC sp_executesql @sql, N'@valid_to datetime', @valid_to=@valid_to;

我建议将
sysname
置于
varchar(50)
之上,以防OP确实有一个名称较长的对象。您当然应该使用
QUOTENAME
,但是SQL注入不是您的朋友。但至少
中的
是参数化的。我建议
sysname
超过
varchar(50)
,以防OP确实有一个名称较长的对象。您当然应该使用
QUOTENAME
,但是SQL注入不是您的朋友。但至少
中的
是参数化的。在
更新
之后,您缺少了一个空格。除了许多其他缺陷之外,这一点很明显来自于这里:
valid\u to='+@valid\u to+'
。您的
@valid\u to
被声明为
datetime
,并且不能由
+
作为字符串连接的一部分。但是
CAST
不能解决这个问题(dateformat,quotes…),正确的解决方案来自Gordon:使用参数并使用
QUOTENAME()
!(或者)在
UPDATE
之后,您缺少了一个空格。除了许多其他缺陷之外,这很明显是从这里产生的:
valid\u to='+@valid\u to+'
。您的
@valid\u to
被声明为
datetime
,并且不能由
+
作为字符串连接的一部分。但是
CAST
不能解决这个问题(dateformat,quotes…),正确的解决方案来自Gordon:使用参数并使用
QUOTENAME()
!(或)