2013-09-10 2 views
0

У меня есть хранимая процедура, которая работает с целью Customer_Aили вида в Customer_B в соответствии с параметром. Параметр изменяет представление, но не основной запрос.T-SQL: Динамическое изменение рабочего вида

Я не хочу писать две разные хранимые процедуры, чтобы просто изменить рабочий вид.

Возможно ли иметь что-то вроде локального синонима вида, чтобы просто изменить заостренный вид?

Благодаря

ответ

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

Одним из способов вы можете сделать это, чтобы добавить новый вид:

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 должны быть реализованы на вершине одного общего мнения, что уже содержит объединение всех данных о клиентах, и мой взгляд выше просто воссоздавать, что основной запрос)

0

Вы могли бы использовать динамический SQL для этого

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

Это склонное к инъекции SQL, не так ли? У меня было много криков в прошлом для таких ответов ... :) –

+0

Только если пользовательский ввод может быть частью запроса. В противном случае нет. –

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 
Смежные вопросы