我有一个存储过程,可以根据参数使用视图Customer_A
或视图。Customer_B
该参数会更改视图,但不会更改基础查询。
我不想编写两个不同的存储过程来改变工作视图。
是否有可能有类似视图的本地同义词来改变指向的视图?
谢谢
我有一个存储过程,可以根据参数使用视图Customer_A
或视图。Customer_B
该参数会更改视图,但不会更改基础查询。
我不想编写两个不同的存储过程来改变工作视图。
是否有可能有类似视图的本地同义词来改变指向的视图?
谢谢
您可以使用 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
您可以这样做的一种方法是添加一个新视图:
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
应该在已经包含所有客户数据的联合的单个通用视图之上实现,而我上面的视图只是重新创建该底层查询)
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
您可以为此使用动态 SQL
declare @tablename
select @tablename = 'customerA'
exec('select * from ' + @tablename)