0

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

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

是否有可能有类似视图的本地同义词来改变指向的视图?

谢谢

4

4 回答 4

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
于 2013-09-10T07:42:14.450 回答
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_A(也可能是视图Customer_B应该在已经包含所有客户数据的联合的单个通用视图之上实现,而我上面的视图只是重新创建该底层查询)

于 2013-09-10T07:42:17.867 回答
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
于 2013-09-10T08:37:52.383 回答
0

您可以为此使用动态 SQL

declare @tablename
select @tablename = 'customerA'
exec('select * from ' + @tablename)
于 2013-09-10T07:42:31.920 回答