在其他Query中使用参数

时间:2015-03-23 07:41:07

标签: sql tsql variables stored-procedures global-variables

我正在创建一个代理作业,在我的表中查找xml字符串。如果有一个尚未运行的xml字符串。我想将它保存为变量,参数或其他东西,以便我可以使用它来合并到我的其他表。如何将xml字符串保存为任何类型的变量,以便我可以在其他查​​询中获取/使用它。

DECLARE @XmlDocument AS xml;
SET @XmlDocument = (SELECT TOP 1 XMLData FROM dbo.Integration WHERE Entity = 'Currency' and [Status] = '0');

我一直在寻找存储过程,但我无法让它工作,如果这是一个很好的方法,我真的很感激一个很好的解释。

编辑2:这是我想要将变量导入的其他查询。

Create Table #TempTable(IntComp NVARCHAR(100), Active NVARCHAR(100), Currency NVARCHAR(100), [Text] NVARCHAR(100))
BEGIN TRY
DECLARE @XmlDocument AS xml;
SET @XmlDocument = '';
WITH XMLNAMESPACES('http://Bla.Bla.Currency' AS ns0)
INSERT INTO #TempTable (IntComp, Active, Currency, [Text])      
            SELECT 
                    @xmldocument.value('/ns0:Currency[1]/Currency[1]/IntComp[1]', 'NVARCHAR(100)') IntComp,
                    @xmldocument.value('/ns0:Currency[1]/Currency[1]/Active[1]', 'NVARCHAR(100)') Active,
                    @xmldocument.value('/ns0:Currency[1]/Currency[1]/Currency[1]', 'NVARCHAR(100)') Currency,
                    @xmldocument.value('/ns0:Currency[1]/Currency[1]/Text[1]', 'NVARCHAR(100)') [Text]                  
MERGE #TempTable AS T
USING dbo.etCurrency AS S
ON (T.IntComp = S.IntComp and T.Currency = S.Currency)
WHEN MATCHED THEN UPDATE
SET T.IntComp = S.IntComp, T.Currency = S.Currency
WHEN NOT MATCHED THEN INSERT
VALUES(S.IntComp, S.Active, S.Currency, S.Text);
UPDATE dbo.Integration
    SET [Status] = '1' WHERE [Status] = '0';
END TRY
BEGIN CATCH
UPDATE dbo.Integration
    SET [Status] = '99', [StatusMessage] = @@ERROR WHERE [Status] = '0';
END CATCH
DROP TABLE #TempTable;

2 个答案:

答案 0 :(得分:2)

您是否只是尝试使用该SQL创建存储过程?如果是这样,那该怎么样;

create procedure dbo.MyProcedure (@XmlDocument XML)
as
begin

    Create Table #TempTable(IntComp NVARCHAR(100), Active NVARCHAR(100), Currency NVARCHAR(100), [Text] NVARCHAR(100))
    BEGIN TRY
        WITH XMLNAMESPACES('http://Opto.Schemas.Currency' AS ns0)
        INSERT INTO #TempTable (IntComp, Active, Currency, [Text])      
                    SELECT 
                            @xmldocument.value('/ns0:Currency[1]/Currency[1]/IntComp[1]', 'NVARCHAR(100)') IntComp,
                            @xmldocument.value('/ns0:Currency[1]/Currency[1]/Active[1]', 'NVARCHAR(100)') Active,
                            @xmldocument.value('/ns0:Currency[1]/Currency[1]/Currency[1]', 'NVARCHAR(100)') Currency,
                            @xmldocument.value('/ns0:Currency[1]/Currency[1]/Text[1]', 'NVARCHAR(100)') [Text]                  
        MERGE #TempTable AS T
        USING dbo.etCurrency AS S
        ON (T.IntComp = S.IntComp and T.Currency = S.Currency)
        WHEN MATCHED THEN UPDATE
        SET T.IntComp = S.IntComp, T.Currency = S.Currency
        WHEN NOT MATCHED THEN INSERT
        VALUES(S.IntComp, S.Active, S.Currency, S.Text);
        UPDATE dbo.Integration
            SET [Status] = '1' WHERE [Status] = '0';
    END TRY
    BEGIN CATCH
        UPDATE dbo.Integration
            SET [Status] = '99', [StatusMessage] = @@ERROR WHERE [Status] = '0';
    END CATCH

    DROP TABLE #TempTable;

end

然后打电话给你,你会用;

DECLARE @XmlDocument AS xml;
SET @XmlDocument = (SELECT TOP 1 XMLData FROM dbo.Integration WHERE Entity = 'Currency' and [Status] = '0');
EXEC dbo.MyProcedure @XmlDocument

答案 1 :(得分:0)

我使用存储过程解决了它:

create procedure getXML
@xml XML 
as
select XMLData
from dbo.Integration
where Entity = 'Currency' and [Status] = '0';
Go

然后通过以下方式调用此存储过程:

declare @xml XML
exec getXML @xml
相关问题