1

我有这个 SQL 语句,但我有错误必须声明标量变量“@InputPath”

IF OBJECT_ID('DBO.SP_INSERT_REQUESTS') IS NULL BEGIN
    EXEC('CREATE PROCEDURE DBO.SP_INSERT_REQUESTS AS RETURN')
    GRANT EXECUTE ON DBO.SP_INSERT_REQUESTS TO PUBLIC
END
GO
ALTER PROCEDURE DBO.SP_INSERT_REQUESTS    
    @Name NVARCHAR(512), 
    @Code NVARCHAR(50),
    @InputPath NVARCHAR(2000),
    @OutputPath NVARCHAR(2000)
AS
GO

SET QUOTED_IDENTIFIER OFF

--DECLARE @InputPath varchar(2000) = "c:\MyDoc1.xsd"

DECLARE @InputValue XML

--DECLARE @OutputPath varchar(2000) = "c:\MyDoc2.xsd"

DECLARE @OutputValue XML

DECLARE @QUERY NVARCHAR(4000) SET @QUERY  = "
    SELECT @InputValue = InputExample.BulkColumn
    FROM OPENROWSET (BULK '"+@InputPath+"', SINGLE_BLOB) AS InputExample;   

    SELECT @OutputValue = InputExample.BulkColumn
    FROM OPENROWSET (BULK '"+@OutputPath+"', SINGLE_BLOB) AS InputExample;
"   

EXEC SP_EXECUTESQL @QUERY, N'@InputValue XML out, @OutputValue XML out', @InputValue out, @OutputValue out

INSERT INTO MyTable(Name, Code, Input, Output)
VALUES('value1', 'value2' , @InputValue, @OutputValue)

我已经声明了参数,所以我不明白为什么会出现错误。

4

2 回答 2

3

删除 'AS' 和 'SET QUOTED_IDENTIFIER OFF' 之间的 GO。问题是您在不同的批次中声明了变量。

于 2013-02-19T15:16:01.837 回答
2

动态 sql 在不同的会话中运行,因此在动态查询之外定义的变量对于动态查询DEMO-HERE将不可用。

再说一次,如果您在动态查询中声明它们,它们将在查询之外不可用。演示 - 这里

我可以理解为什么您使用动态 sql,因为您无法将参数传递给 openrowset。我认为你可以做这样的事情来解决这个问题。演示

于 2013-02-19T15:21:18.737 回答