Динамический SQL с переменными внутри представления (SQL Server) - PullRequest
2 голосов
/ 11 мая 2011

Здравствуйте. По сути, я пытаюсь сделать это в новом окне представления в SQL Server 2008:

Declare @var = (выберите БД из баз данных);exec ('выберите имя из' + @var '+ .dbo.Names);

Это представление фактически выполняется в SQL Server, но я не могу сохранить его (оно дает мне ошибку), потенциально я мог бы просто создатьвозвращая таблицу, делайте все то же самое в ней, возвращайте таблицу и создавайте представление, которое в основном берет все из этой таблицы, но я не был уверен в падении производительности, которое могло произойти из-за этого.Любые предложения будут ценны!Спасибо.

Решение: я просто удалил старое представление и заново создал новое представление (используя динамический sql) в хранимой процедуре.Когда это значение будет изменено, я просто вызову SP, который обновит представления, чтобы указать на правильные базы данных.Спасибо всем за помощь, ребята, зная, что не может быть сделано, помешал мне попробовать эти методы.

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Просмотр не может принимать параметры. Табличная функция является решением. Но вы должны по крайней мере знать таблицу и набор результатов, который выйдет на другом конце. Если вы передаете таблицу для запроса в качестве параметра, откуда вы знаете структуру результирующего набора данных?

0 голосов
/ 13 декабря 2017

Вы можете легко подделать внутреннюю переменную в вашем представлении, используя CTE. Вы можете протестировать его в своей версии SQL Server.

CREATE VIEW vwImportant_Users AS
WITH params AS (
    SELECT 
    varType='%Admin%', 
    varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers, params
    WHERE status > varMinStatus OR name LIKE varType

SELECT * FROM vwImportant_Users

выходная мощность:

status  name
12      dbo
0       db_accessadmin
0       db_securityadmin
0       db_ddladmin

также через JOIN

WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers INNER JOIN params ON 1=1
    WHERE status > varMinStatus OR name LIKE varType

также через CROSS APPLY

WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params
    WHERE status > varMinStatus OR name LIKE varType
...