我想在以下请求的末尾创建一个视图。 我知道'create view'必须是查询批处理中的第一个语句。我的问题是,对于这个查询,我必须使用一个变量(@listOfIDRUB)。 这个变量只在我的小脚本末尾正确填充。
我也尝试在第一次声明之前创建视图但是它创建了“DECLARE”的问题。
那么可以从我的脚本结果中轻松创建一个视图,或者我必须做其他事情吗?
DECLARE @CounterResId int;
DECLARE @lePath varchar(255);
DECLARE @listOfIDRUB TABLE (EXTERNALREFERENCE uniqueidentifier, ID varchar(255), DOCID varchar(255) );
DECLARE @Max int;
SET @lePath = '';
SET @CounterResId = 1;
SET @Max = (SELECT COUNT(*) FROM SYNTHETIC..EXTRANET_PURGE WHERE TYPE_SUPPR = 'ResId')
WHILE (@CounterResId <= @Max )
BEGIN;
set @lePath =
(select tmp.lePath from
(
select row_number() over(order by path)as NumLigne, CONCAT(path, '%' ) as lePath from RUBRIQUE
WHERE MODELE = 'CAEEE64D-2B00-44EF-AA11-6B72ABD9FE38'
and CODE in (SELECT ID FROM SYNTHETIC..EXTRANET_PURGE where TYPE_SUPPR='ResId')
) tmp
WHERE tmp.NumLigne = @CounterResId)
INSERT INTO @listOfIDRUB(EXTERNALREFERENCE, ID, DOCID)
SELECT SEC.EXTERNALREFERENCE , SEC.ID, SEC.DOCUMENTID
FROM WEBACCESS_FRONT..SECTIONS sec
inner join rubrique rub ON rub.ID_RUBRIQUE = sec.EXTERNALREFERENCE
inner join template_tree_item tti ON tti.id_template_tree_item = rub.modele
inner join template t ON t.id_template = tti.template
WHERE t.CODE IN (SELECT TEMPLATE_CODE from SYNTHETIC..EasyFlowEngineListTemplateCode)
and rub.path like @lePath
print @CounterResId;
print @lePath;
set @CounterResId = @CounterResId + 1;
END;
select * from @listOfIDRUB;
而不是select * from @listOfIDRUB
我想要create view test as select * from listOfIDRUB
我也尝试过创建视图测试(我所有的请求)
答案 0 :(得分:1)
每当您询问有关SQL的内容时,请说明您的RDBMS(产品和版本)。答案很大程度上取决于......
从您的代码中我假设这是SQL Server。
所以对你的问题:不,一个VIEW必须是'#34;内联的&#34; (单一陈述或&#34; ad-hoc&#34;)陈述。
您可能会考虑使用多语句UDF,但这几乎在所有情况下都是坏事(性能不佳)。只有这样,如果你的结果表只包含很少的行!
在不知道你的桌子的情况下,这是相当盲目的行走,但你可以试试这个(如果你可以将外部操作(例如过滤)转移到函数中,则添加参数):
CREATE FUNCTION dbo.MyFunction()
RETURNS @listOfIDRUB TABLE (EXTERNALREFERENCE uniqueidentifier, ID varchar(255), DOCID varchar(255) )
AS
BEGIN
DECLARE @CounterResId int;
DECLARE @lePath varchar(255);
DECLARE @Max int;
SET @lePath = '';
SET @CounterResId = 1;
SET @Max = (SELECT COUNT(*) FROM SYNTHETIC..EXTRANET_PURGE WHERE TYPE_SUPPR = 'ResId')
WHILE (@CounterResId <= @Max )
BEGIN;
set @lePath =
(select tmp.lePath from
(
select row_number() over(order by path)as NumLigne, CONCAT(path, '%' ) as lePath from RUBRIQUE
WHERE MODELE = 'CAEEE64D-2B00-44EF-AA11-6B72ABD9FE38'
and CODE in (SELECT ID FROM SYNTHETIC..EXTRANET_PURGE where TYPE_SUPPR='ResId')
) tmp
WHERE tmp.NumLigne = @CounterResId)
INSERT INTO @listOfIDRUB(EXTERNALREFERENCE, ID, DOCID)
SELECT SEC.EXTERNALREFERENCE , SEC.ID, SEC.DOCUMENTID
FROM WEBACCESS_FRONT..SECTIONS sec
inner join rubrique rub ON rub.ID_RUBRIQUE = sec.EXTERNALREFERENCE
inner join template_tree_item tti ON tti.id_template_tree_item = rub.modele
inner join template t ON t.id_template = tti.template
WHERE t.CODE IN (SELECT TEMPLATE_CODE from SYNTHETIC..EasyFlowEngineListTemplateCode)
and rub.path like @lePath
--print @CounterResId;
--print @lePath;
set @CounterResId = @CounterResId + 1;
END;
RETURN;
END
您可以这样称呼它(非常类似于VIEW)
SELECT * FROM dbo.MyFunction();
你甚至可以在连接中使用它......
最后但并非最不重要的是,我非常肯定,一个人可以在没有声明和循环的情况下解决这个问题......