我正在创建一个将选择表中所有数据的查询。查询将根据我将在存储过程上传递的变量选择表格。
这是我的例子。如果我执行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
答案 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