T-SQL:动态更改工作视图

时间:2013-09-10 07:39:14

标签: sql sql-server tsql dynamic view

我有一个存储过程可以根据参数使用视图Customer_A 视图Customer_B。该参数更改视图但不更改基础查询。

我不想写两个不同的存储过程来改变工作视图。

是否可以在视图中使用类似本地同义词的内容来更改指向的视图?

由于

4 个答案:

答案 0 :(得分:1)

您可以使用sp_executesql和QuoteName。 QuoteName将在您传递的名称周围放置括号,sp_executesql将执行动态创建的SQL。

CREATE PROCEDURE RunView
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @SQL AS NVARCHAR(MAX)

    SET @SQL = 
    N'SELECT * FROM ' + QuoteName(@ViewName) 

    EXECUTE sp_executesql @SQL
END

答案 1 :(得分:1)

您可以采用的一种方法是添加新视图:

CREATE VIEW Customers
AS
   SELECT *, --TODO, Name columns
          'A' as CustomerName
   FROM Customer_A
   UNION ALL
   SELECT *, --Ditto
          'B'
   FROM Customer_B

现在,您的存储过程可以查询它并根据CustomerName列选择适当的数据。当然,您只需要这个新视图,因为您错误地将要查询的实际数据(例如客户名称)嵌入到元数据中(视图的名称的)。

(也可能是视图Customer_ACustomer_B应该在已包含所有客户数据的联合的单个通用视图的顶部实现,而我上面的视图只是重新创建该基础查询)

答案 2 :(得分:0)

您可以使用动态SQL

declare @tablename
select @tablename = 'customerA'
exec('select * from ' + @tablename)

答案 3 :(得分:0)

create view Customer_A as select 1 a
GO

create view Customer_B as select 2 a
GO

create procedure p_test
(
@view int
) with recompile
as
if @view = 1 
 select * from Customer_A
else if @view = 2
 select * from Customer_B

GO

exec p_test 1
exec p_test 2