2013-02-19 84 views
0

我有這樣的SQL語句,但我有錯誤必須聲明標量變量「@InputPath」必須聲明標量變量錯誤SQL

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 '"[email protected]+"', SINGLE_BLOB) AS InputExample; 

    SELECT @OutputValue = InputExample.BulkColumn 
    FROM OPENROWSET (BULK '"[email protected]+"', 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) 

我已經聲明的參數,所以我不明白爲什麼我我正在得到錯誤。

+0

也許在查詢字符串中的分號.. – aspiring 2013-02-19 15:13:49

回答

2

刪除介於'AS'和'SET QUOTED_IDENTIFIER OFF'之間的GO。問題是你在一個不同的批處理中聲明變量。

+0

謝謝你非常mutch – user2064653 2013-02-19 15:16:40

+2

它不會解決問題,因爲動態sql在不同的會話中運行。 – Kaf 2013-02-19 15:22:56

2

動態sql在不同會話中運行,因此動態查詢以外定義的變量將不可用於動態查詢DEMO - HERE

然後再次,如果您在動態查詢中聲明它們,它們將不會在查詢外部可用。 DEMO - HERE

我可以看到你爲什麼使用動態sql因爲你無法傳遞參數給openrowset。我認爲你可以做這樣的事情來解決問題。 DEMO