我们可以在变量脚本之后创建一个视图吗?

时间:2015-12-28 11:06:12

标签: sql sql-server

我想在以下请求的末尾创建一个视图。 我知道'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 我也尝试过创建视图测试(我所有的请求)

1 个答案:

答案 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();

你甚至可以在连接中使用它......

最后但并非最不重要的是,我非常肯定,一个人可以在没有声明和循环的情况下解决这个问题......