【问题标题】:How to take table name as an input parameter to the stored procedure?如何将表名作为存储过程的输入参数?
【发布时间】:2014-04-02 01:02:05
【问题描述】:

我在下面有一个小存储过程。

我将表名作为存储过程的输入参数,因此我打算将数据插入临时表并显示相同的数据。这只是我的项目存储过程的一个小代码块。

当我编译下面的内容时,它将select语句中的参数视为表变量并将错误抛出为:

必须声明表变量“@TableName”。

SQL:

CREATE PROCEDURE xyz @TableName Varchar(50) 
AS 
BEGIN 
SELECT TOP 10 * INTO #Temp_Table_One 
FROM @TableName 

SELECT * FROM #Temp_Table_One 
END

【问题讨论】:

标签: sql-server stored-procedures table-variable


【解决方案1】:

使用sql动态

试试

CREATE PROCEDURE xyz @TableName Varchar(50) 
AS 
BEGIN 
 DECLARE @query
 set @query = 'SELECT TOP 10 * FROM '+ @TableName 
 EXEC @query
END

添加架构名称。

例如:

exec xyz @TableName = 'dbo.mytable'

exec xyz @TableName = 'myschema.mytable'

【讨论】:

  • 谢谢路易斯。感谢您及时的回复。当我编译这个很好。但是当我通过提供表名作为参数值来执行 SP 时,它又抛出了一个名为“找不到存储过程 'SELECT TOP 10 * FROM dbo.Employee_One'”的错误。您的程序中的一个小改动。您在声明 @query 时忘记提供数据类型。我通过提供 varchar(100) 尝试了没问题。以下来自 ALi 的回复可以很好地满足我的要求。无论如何,感谢您为我花费宝贵的时间。非常感谢。干杯:)
【解决方案2】:
CREATE PROCEDURE xyz 
@TableName NVARCHAR(128) 
AS 
BEGIN 
  SET NOCOUNT ON;
  DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'SELECT TOP 10 * INTO #Temp_Table_One 
              FROM ' + QUOTENAME(@TableName)
          + N' SELECT * FROM #Temp_Table_One '

 EXECUTE sp_executesql @Sql

END

【讨论】:

  • 我不同意你的观点,@TCS 这是 100% 安全的代码。我使用了QUOTENAME 函数,它将方括号[] 放在传递的参数周围,并强制sql server 将其视为对象名称。如果您尝试在参数中传递某种 sql 命令,它将被视为对象名称并出错。但你永远不会成为 Sql-injection 的受害者。
  • 当我这样做时,我收到一条错误消息,指出 QUOTENAME 未解析。谁能给我指个方向?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 2013-06-11
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多