2016-06-27 18 views
0

私は70から461 TSQLトレーニングの本を読んでいたし、ストアドプロシージャに関する部分は、この...渡すプロシージャのパラメータ

「するProc1で宣言された変数とするProc1のパラメータのいずれかに表示されていないと述べましたするProc1" によって呼び出される手続き

しかし、同じブック内

CREATE PROCEDURE Sales.ListCustomerByAddress 
(@address AS NVARCHAR(60)) 
AS 
DECLARE @SQLString AS NVARCHAR(4000); 
SET @SQLString = ' 
SELECT companyname, contactname 
FROM Sales.Customers WHERE address = @address'; 

EXECUTE sp_executesql 
     @statement = @SQLString, 
     @params = N'@address NVARCHAR(60)', 
     @address = @address; 
RETURN; 
GO 

この

た引用された文の私の理解では、 @SQLString変数と @addressパラメータがに見えることができないということで、プロシージャによって参照される sp_executesql?変数は値を保持するオブジェクトなので、存在しない場合や見えない場合(例: @statement =)、値の使用方法または渡し方は

この矛盾を解決するのに役立つ人はいますか?

+2

varをサブプロシージャに渡すことができます。サブプロシージャは自動的に上記の変数を参照しません –

+0

ありがとうございます@ juergend、私の考えを正確に。私はその声明が誤っていることを知っていた。 – ola

+0

それは技術的に間違いではなく、ちょうどフレーズが不十分です。彼らは目に見えない...あなたがそれらを目に見えるようにしなければ... – ZLK

答えて

0

子プロセス内の親プロシージャで定義された変数またはパラメータを参照できないと言っていました。

ので手順(親):

CREATE PROCEDURE Sales.sp_CustomExecSQL 
as 
Exec(@SQLString) 
GO 
しかし、あなたはあなたの例で示したように、あなたが渡すことができます。

CREATE PROCEDURE Sales.ListCustomerByAddress 
(@address AS NVARCHAR(60)) 
AS 
DECLARE @SQLString AS NVARCHAR(4000); 
SET @SQLString = ' 
SELECT companyname, contactname 
FROM Sales.Customers WHERE address = @address'; 

EXECUTE sp_CustomExecSQL 
RETURN; 
GO 

そして、子手順sp_CustomExecSQLは、以下のように@SQLString参照することができませんでした変数またはパラメータを親プロシージャから子プロシージャのパラメータに変更する

+0

それはもっとはっきりしていた。 Mr. Shipmanありがとうございます。 – ola

関連する問題