Create View-объявление переменной
Я создаю представление, которое использует эту функцию STUFF
. Я хочу поместить результат STUFF
в переменную для моего представления. Проблема, с которой я сталкиваюсь, заключается в объявлении моей переменной. Это дает мне сообщение "неправильный синтаксис рядом с 'DECLARE'. Ожидая ' ('или выбрать." у меня уже есть " ("там. Я попытался поставить перед ним BEGIN
. Я попытался поставить его после слова SELECT
. Но ничего не получается, и я не могу найти решение в своих поисках. Я использую SQL Server 2012
CREATE VIEW [AQB_OB].[GISREQUESTEDBURNS]
AS
(DECLARE @CONDITIONS AS varchar(20)
SET @CONDITIONS = (SELECT DISTINCT BD.[RequestedBurnsID]
,[ConditionsReasonsID] = STUFF((SELECT ', ' + CONVERT(VARCHAR (20),[ConditionsReasonsID]) FROM [AQB_OB].[BurnDecisions] WHERE [RequestedBurnsID]= BD.[RequestedBurnsID] ORDER BY [RequestedBurnsID] ASC
FOR XML PATH ('')) , 1 , 1, '') FROM
[AQB_OB].[BurnDecisions] BD)
SELECT RB.[RequestedBurnsID] AS REQUESTEDBURNID
,BUY.[BurnYear] AS BURNYEAR
,CY.[CurrentYear] AS CURRENTYEAR
,RB.[BurnSitesID] AS BURNSITESID
,[BurnerID] AS BURNERID
,[Contact] AS CONTACT
,[BurnDecision] AS BURNDECISION
,RB.[Comment] AS COMMENT
,@CONDITIONS AS CONDITIONS
FROM [AQB_MON].[AQB_OB].[RequestedBurns] RB
LEFT join AQB_MON.[AQB_OB].[PileDryness] PD on RB.[PileDrynessID] = PD.[PileDrynessID]
inner join AQB_MON.[AQB_OB].[BurnYear] BUY on BUY.BurnYearID = BP.BurnYearID
inner join AQB_MON.[AQB_OB].[CurrentYear] CY on CY.CurrentYearID = BUY.CurrentYearID
GO
3 ответа:
В представлении нельзя объявлять переменные. Можно ли превратить его в функцию или хранимую процедуру?
Edit-вы также можете поместить что-то в CTE и сохранить его в виде представления.
Например
with conditions as ( ... do the STUFF here ) select blah from blah inner join conditions (or cross join conditions if its just one row, I can't quite decipher what your data is like)
Попробуйте поместить подзапрос условия непосредственно в инструкцию view select. вы можете привести XML к VARCHAR (20).
CREATE VIEW [AQB_OB].[GISREQUESTEDBURNS] AS SELECT RB.[RequestedBurnsID] AS REQUESTEDBURNID ,BUY.[BurnYear] AS BURNYEAR ,CY.[CurrentYear] AS CURRENTYEAR ,RB.[BurnSitesID] AS BURNSITESID ,[BurnerID] AS BURNERID ,[Contact] AS CONTACT ,[BurnDecision] AS BURNDECISION ,RB.[Comment] AS COMMENT, ( SELECT DISTINCT BD.[RequestedBurnsID], [ConditionsReasonsID] = STUFF((SELECT ', ' + CONVERT(VARCHAR (20), [ConditionsReasonsID]) FROM [AQB_OB].[BurnDecisions] WHERE [RequestedBurnsID]= BD.[RequestedBurnsID] ORDER BY [RequestedBurnsID] ASC FOR XML PATH ('')) , 1 , 1, '') FROM [AQB_OB].[BurnDecisions] BD ) AS CONDITIONS FROM [AQB_MON].[AQB_OB].[RequestedBurns] RB LEFT join AQB_MON.[AQB_OB].[PileDryness] PD on RB.[PileDrynessID] = PD.[PileDrynessID] inner join AQB_MON.[AQB_OB].[BurnYear] BUY on BUY.BurnYearID = BP.BurnYearID inner join AQB_MON.[AQB_OB].[CurrentYear] CY on CY.CurrentYearID = BUY.CurrentYearID
Вот пример запроса, который использует 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