Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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 2008 必须声明标量变量"@模板“U名称”;_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 必须声明标量变量"@模板“U名称”;

Sql server 2008 必须声明标量变量"@模板“U名称”;,sql-server-2008,tsql,Sql Server 2008,Tsql,我在尝试执行以下代码时出错,寻找类似的解决方案,但无法解决 DECLARE @TAB_COL_NAME TABLE(idx int identity(1,1), COLUMNNAME VARCHAR(MAX)) DECLARE @TEMPLATE_NAME NVARCHAR(50) SET @TEMPLATE_NAME = 'MYTABLE1' INSERT INTO @TAB_COL_NAME EXEC('SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.C

我在尝试执行以下代码时出错,寻找类似的解决方案,但无法解决

DECLARE @TAB_COL_NAME TABLE(idx int identity(1,1), COLUMNNAME VARCHAR(MAX))
DECLARE @TEMPLATE_NAME NVARCHAR(50)
SET @TEMPLATE_NAME = 'MYTABLE1'
INSERT INTO @TAB_COL_NAME EXEC('SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '+@TEMPLATE_NAME)
自从我看到很多人说要使用
sp\u executesql,
我就试过
sp\u executesql

  DECLARE @SQL NVARCHAR(100)
  DECLARE @TEMPLATE_NAM NVARCHAR(50)
  SET @TEMPLATE_NAM = 'MYTABLE1'
  SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '+ '@TEMPLATE_NAME'
 EXEC sp_executesql @SQL,
                   '@TEMPLATE_NAME Nvarchar(50)',
                    @TEMPLATE_NAME = @TEMPLATE_NAM
这给出了错误:
过程需要类型为“ntext/nchar/nvarchar”的参数“@parameters”。

正确的解决方案是什么

我不能在
execsql
中实现这一点吗


一些答复会有帮助

将N添加到sp_executesql的第二个参数中,使其成为常数nvarchar

EXEC sp_executesql @SQL,
               N'@TEMPLATE_NAME Nvarchar(50)',
                @TEMPLATE_NAME = @TEMPLATE_NAM

为什么要传递变量?在你的情况下,你没有义务这么做。使用串联尝试以下操作:

DECLARE @SQL NVARCHAR(100) DECLARE @TEMPLATE_NAME NVARCHAR(50) SET @TEMPLATE_NAME = 'mytable' SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '''+ @TEMPLATE_NAME + '''' print @SQL EXEC sp_executesql @SQL 声明@SQL NVARCHAR(100) 声明@TEMPLATE_NAME NVARCHAR(50) SET@TEMPLATE\u NAME='mytable' SET@SQL=N'从信息_SCHEMA.COLUMNS中选择列_NAME,其中表_NAME=''+@TEMPLATE_NAME+''' 打印@SQL EXEC sp_executesql@SQL 但是,如果必须参数化,可以按以下方式使用sp_executesql

DECLARE @SQL NVARCHAR(100) DECLARE @TEMPLATE_NAME NVARCHAR(50) SET @TEMPLATE_NAME = 'mytable'; SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TEMPLATE_NAME'; EXEC sp_executesql @SQL , N'@TEMPLATE_NAME NVARCHAR(50)', @TEMPLATE_NAME 声明@SQL NVARCHAR(100) 声明@TEMPLATE_NAME NVARCHAR(50) SET@TEMPLATE_NAME='mytable'; SET@SQL=N'从信息_SCHEMA.COLUMNS中选择COLUMN_NAME,其中TABLE_NAME=@TEMPLATE_NAME'; EXEC sp_executesql@SQL,N'@TEMPLATE_NAME NVARCHAR(50)',@TEMPLATE_NAME
虽然在给定的示例中不会出现这种情况,但通过串接字符串来执行sp_executesql的方法需要sql注入。这个答案正确地使用了参数。参数2定义要传递给字符串的参数,3+是要传递的参数

此外,如果参数中有撇号,则连接版本将失败:
SET@TEMPLATE_NAME='[MYTABLE“1]”。在这种情况下不太现实,但在使用动态sql时通常需要注意

 DECLARE @SQL NVARCHAR(100);
  DECLARE @TEMPLATE_NAME NVARCHAR(50);
  SET @TEMPLATE_NAME = 'MYTABLE1';
  SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TEMPLATE_NAME';
 EXEC sp_executesql @SQL , N'@TEMPLATE_NAME NVARCHAR(50)',  @TEMPLATE_NAME;

因此,您正在尝试创建并运行一个存储过程,该过程将在您的表中插入有关作为参数传递的表的所有列的信息。
TAB\u COL\u NAME
。是的,正确:)…这就是我试图做的,它工作正常,但当我尝试传递参数时它不工作。谢谢,这就是我犯的错误吗?“”?你能解释一下吗?你也可以传递参数,但这是一种更简单的方法。我输入的代码也可以放入存储过程中。连接字符串时,缺少表名的引号。虽然这是一个无害的查询,但这是一个SQL注入风险,因为它没有参数化,sp_executesqlAndd的重点是什么?理解OP如何不正确地使用sp_executesql无助于OP。请告诉我如何参数化上述查询?当前示例将放在存储过程中。如果以参数化的方式调用存储过程,SQL注入就不是问题。@StephenBorg:你是对的,你的答案会有效,但用这种方式做事情是不好的。我认为这是一件好事,显示双方的方式。