3

次のコードは、コンマで区切られているかどうかに関係なく文字列を取得し、その部分が問題なく機能するテーブル (#tmpFullanme) に配置することになっています。2 番目の部分は、入力内容に基づいて % 記号の有無にかかわらず、LIKE / NOT LIKE であるすべての値を返すと想定されています。私が得ているエラーは、「マルチパート識別子 "#tmpFullname.Item" をバインドできませんでした」です。私が持っている最良の推測は、それが範囲外である可能性があるということですか?

DROP PROCEDURE uspJudgments; 
GO 
CREATE PROCEDURE uspJudgments 
@fullName varchar(100), @SrchCriteria1 varchar(15), @SrchCriteria2 varchar(15), @qualifier varchar(10) 
AS 
BEGIN 

SELECT * 
INTO #tmpFullname 
FROM dbo.DelimitedSplit8K(@fullName, ',') 

DECLARE @Query NVarChar(1024) 
SET @Query = 'SELECT d.*' + ' FROM defendants_ALL d, #tmpFullname' + 
' WHERE d.combined_name' + ' ' + @qualifier + ' ' + '''' + @SrchCriteria1 + '''' + ' + ' + '''' + #tmpFullname.Item + '''' + ' + ' + '''' + @SrchCriteria2 + '''' 

END 

EXEC sp_executesql @Query 
PRINT(@Query) 

IF OBJECT_ID('#tmpFullname', 'U') IS NOT NULL 
DROP TABLE #tmpFullname 

EXEC uspJudgments @qualifier = 'LIKE', @fullName = 'johnson', @SrchCriteria1 = '%', @SrchCriteria2 = '%'

「マルチパート識別子 "#tmpFullname.Item" をバインドできませんでした」ため、PRINT 出力に到達できません。#tmpFullname.Item を '#tmpFullname.Item に変更すると、通過して何も返されませんが、そのテーブルの問題を除いてクエリが正しいことが示されます。

SELECT d.* FROM defendants_ALL d, #tmpFullname WHERE d.combined_name LIKE '%' + '#tmpFullname.Item' + '%'

これを動的クエリにして、ステートメントを LIKE から IN などに変更できるようになるまでは、非常にうまく機能していたことに注意してください。

4

3 に答える 3

5

適切なスクリプトを取得して目的の結果を得るために、完全なテストをセットアップしました。これがどのように機能するかを示す SQL Fiddleもあります。EXECUTE sp_executesql @Queryストアドプロシージャ内で実行する必要があります

ALTER PROCEDURE uspJudgments @fullName varchar(100)
   , @SrchCriteria1 varchar(15)
   , @SrchCriteria2 varchar(15)
   , @qualifier varchar(10) 
AS 
BEGIN 

   --Simulates your split function
   SELECT *
   INTO #tmpFullName
   FROM
   (
     SELECT 'firstTest' AS Item
     UNION ALL SELECT 'secondTest'
     UNION ALL SELECT 'NotThere'
   ) AS t;

   DECLARE @Query NVARCHAR(1024);
   SELECT @Query = 'SELECT d.* '
      + ' FROM defendants_ALL d '
      + ' CROSS JOIN #tmpFullName AS t '
      + ' WHERE d.combined_name' + ' ' + @qualifier + ' '
      + '''' + @SrchCriteria1 + ''''
      + ' + ' + 't.Item' + ' + ' + '''' + @SrchCriteria2 + '''';

   EXECUTE sp_executesql @Query;

END

EXECUTE uspJudgments
@fullName = 'does not matter'
   , @SrchCriteria1 = '%'
   , @SrchCriteria2 = '%'
   , @qualifier = 'LIKE';
于 2012-10-22T23:25:06.213 に答える
1

この場合、tempdb プレフィックスを使用する必要があります。

insert into tempdb..#TABLENAME

set @query = 'select * from tempdb..#TABLENAME'
于 2012-10-23T12:10:04.020 に答える
1

さて、私の最後の答えの後、私はいくつかのことを見つけました..あなたの手順を調べると、「」で始まり、次に「 」テーブルにBEGIN挿入し、 「 」変数を宣言して選択ステートメントを作成します。#tmpFullName@Query

その後、「END」を実行し、その後にロジックを付けます。" " を実行したsp_executesql後、temptable を削除し、現在のプロシージャを実行して実行します。

申し訳ありませんが、ストラクチャーはそれほど読みやすくありません。だから多分あなたは最初にそこに行きます。奇妙な構造のほか#tmpFullName.Itemに、動的 SQL で " " をパラメーターとして使用していますが、SQL クエリ自体の中で宣言されています。だからあなたはこのようなことをしなければなりません:

SET @Query = 'SELECT d.*' + ' FROM defendants_ALL d, #tmpFullname' + 
  ' WHERE d.combined_name' + ' ' + @qualifier + ' ' + '''' + @SrchCriteria1 + '''' + ' + ' + ' #tmpFullname.Item ' + ' + ' + '''' + @SrchCriteria2 + '''' 

" #tmpFullName.Item" は、パラメーターとしてではなく、コード内に存在します。しかし、繰り返しになりますが、ここで何を達成しようとしていますか? これに完全に答えるには、他の変数が何であるかを知る必要があります。あなたの構造は、何を達成しようとしているのかを教えてくれません..

もう本当に手が出ません…。

于 2012-10-29T07:08:58.523 に答える