如何在SQL Server查询中使用FROM子句中的变量?

时间:2016-12-20 20:40:29

标签: sql-server tsql

我正在创建一个将选择表中所有数据的查询。查询将根据我将在存储过程上传递的变量选择表格。

这是我的例子。如果我执行example_sp table1,它将在table1中选择。如果我使用example_table table2,它应该选择table2

ALTER PROCEDURE example_sp
    @type varchar(10), -- value will be `table1` or `table2`
AS
BEGIN
    SELECT * FROM @type
END

3 个答案:

答案 0 :(得分:2)

您需要动态SQL来传递表名和列名等标识符:

ALTER PROCEDURE example_sp (
    @tablename varchar(10) -- value will be `table1` or `table2`
)
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);

    SET @sql = 'SELECT t.* FROM @tablename t';

    SET @sql = REPLACE(@sql, '@tablename', QUOTENAME(@tablename));

    EXEC sp_executesql @sql;
END;

答案 1 :(得分:2)

戈登建议的版本略有不同......

ALTER PROCEDURE example_sp
    @TableName SYSNAME   --<-- Use appropriate data type for sql server objects
AS
BEGIN
  SET NOCOUNT ON;

  Declare @Sql NVARCHAR(MAX);

  SET @Sql = N' SELECT * FROM ' + QUOTENAME(@TableName)

  Exec sp_executesql @Sql
END

答案 2 :(得分:0)

您的SP必须返回2个结果集,其中一个为空。只需输入两个SELECT语句,包括WHERE @type = 'table1'

如果结果集匹配则更好,在这种情况下,您可以简单地将它们与UNION

合并