sql-server-2008 - 必须声明标量变量 "@TEMPLATE_NAME"

标签 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.COLUMNS WHERE TABLE_NAME = '+@TEMPLATE_NAME)

因为看到很多人说要用sp_executesql, 我试过sp_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

这给出了错误:Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'。

正确的解决方案是什么?

我不能在 EXEC SQL 中实现吗?

一些回复会有所帮助。

最佳答案

你为什么要传递变量?在您的情况下,您不必这样做。使用串联尝试以下操作:

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

但是,如果必须参数化,可以按以下方式使用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-server-2008 - 必须声明标量变量 "@TEMPLATE_NAME",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17674084/

相关文章:

c# - 内部声明变量的 T-SQL 参数化查询?

sql - 连接两个表,只使用右表的最新值

.net - 查看 sp_execute 正在做什么

sql - sql server 中的新行

sql - 在 T-SQL 中查找企业当前是否营业

sql-server - SQL 中 VARCHAR 的 String.IsNullOrEmpty 类似函数?

sql-server - Sql Server Management Studio如何自动大写

c# - SQL CLR 和可为空的日期时间参数

SQL其中,从今天开始的日期加减天

sql-server - 将日期时间转换为 UTC 值 mssql