我有一个存储过程可以根据参数使用视图Customer_A
或 视图Customer_B
。该参数更改视图但不更改基础查询。
我不想写两个不同的存储过程来改变工作视图。
是否可以在视图中使用类似本地同义词的内容来更改指向的视图?
由于
答案 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_A
和Customer_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