如何将表名作为存储过程的输入参数?

cha*_*har 10 sql-server stored-procedures table-variable

我下面有一个小的存储过程.

我将表名作为存储过程的输入参数,以便我计划将数据插入临时表并显示相同的内容.这只是我项目存储过程的一个很小的代码块.

当我编译下面的内容时,它会将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
Run Code Online (Sandbox Code Playgroud)

M.A*_*Ali 20

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
Run Code Online (Sandbox Code Playgroud)


小智 5

使用动态sql

尝试

CREATE PROCEDURE xyz @TableName VARCHAR(50) 
AS 
BEGIN 
 DECLARE @query VARCHAR(1000)
 set @query = 'SELECT TOP 10 * FROM '+ @TableName 
 EXEC (@query)
END
Run Code Online (Sandbox Code Playgroud)

添加架构名称。

例如:

exec xyz @TableName = 'dbo.mytable'

exec xyz @TableName = 'myschema.mytable'

  • 谢谢路易斯。感谢您及时的回复。当我编译这个时,一切都很好。但是,当我通过提供表名作为参数值来执行 SP 时,它又抛出一个名为“无法找到存储过程 'SELECT TOP 10 * FROM dbo.Employee_One'”的错误。您的程序有一个微小的变化。您在声明 @query 时忘记提供数据类型。我尝试提供 varchar(100) 没问题。以下来自 ALi 的回复可以很好地满足我的要求。不管怎样,感谢您为我花费宝贵的时间。多谢。干杯:) (2认同)