2

変数で生成した文字列から SQL クエリを実行しようとしています。このSPはSelectクエリを生成し、このクエリを手動で実行すると機能しますが、SPにあると次のようなエラーが発生します

メッセージ 911、レベル 16、状態 4、プロシージャ sp_Products_Select、行 26
データベース 'SELECT *,(SectionID = Products のセクションからセクションを選択' が存在しません。名前が正しく入力されていることを確認してください。

SPから生成されたクエリ

SELECT 
   *, 
   (Select Section 
    From Sections 
    Where SectionID = dbo.Products.SectionID) as Section,
   (Select Category 
    From Categories 
    Where CategoryID = Products.CategoryID) as Category 
FROM 
    Products 
WHERE 
    1 = 1AND (Status = 1 OR Status = 0)

そして私のSPは、

ALTER PROC [dbo].[sp_Products_Select]
    @ProductID int,
    @Status int,
    @CategoryID int,
    @SectionID int
AS

DECLARE @SQL varchar(500)
SET @SQL ='SELECT *,(Select Section From Sections Where SectionID = Products.SectionID) as Section,(Select Category From Categories Where CategoryID = Products.CategoryID) as Category FROM Products WHERE 1 = 1';
IF @ProductID <> '0' BEGIN
    SET @SQL += 'AND ProductID = @ProductID';
END
IF  @Status <> 0 BEGIN 
    SET @SQL += 'AND Status = @Status';
END ELSE BEGIN
    SET @SQL += 'AND (Status = 1 OR Status = 0)';
END
IF @CategoryID <> '0' BEGIN
    SET @SQL += 'AND CategoryID = @CategoryID';
END
IF @SectionID <> '0' BEGIN
    SET @SQL += 'AND SectionID = @SectionID';
END

EXEC @SQL

SP からこのクエリを正しく実行するにはどうすればよいですか?

4

4 に答える 4

3

WHERE句にスペースがありません:

WHERE 
    1 = 1AND (Status = 1 OR Status = 0)

でなければなりません:

WHERE 
    1 = 1 AND (Status = 1 OR Status = 0)
         *
         * space here is absolutely essential!

そのため、T-SQL ステートメントを構築するストアド プロシージャのコードを変更して、T-SQL ステートメントとの間に少なくとも1 つのスペースを入れる必要があります。1 = 1AND ....

( Martin Smith が発見したように、それは問題ではありませんでした.... )

更新:わかりました-結局のところ、スペースは必要ないようです.....

しかし:使ってみてください

EXEC (@SQL)

SQL ステートメントを実行するときは、括弧で囲む必要があると思います。

于 2012-08-29T08:53:34.917 に答える
1

クエリを単純化してみてください。

SELECT  a.*, b.Section, c.Section
FROM    Products a
            INNER JOIN Sections b
                ON a.SectionID = a.SectionID
            INNER JOIN Categories c
                ON a.SectionID = c.Category

そしてあなたのSET @SQL構文では、あなたはそれらを使う必要がありadd extra spaceます。

SET @SQL += ' AND ProductID = @ProductID';
             ^ here
于 2012-08-29T08:55:07.480 に答える
1

編集:

したがって、EXEC(..)すべての問題が解決するわけではありません。

内部で実行したい場合は、 @ProductID と @CategoryID および動的クエリのその他のパラメーターを宣言する必要さえあると思います。

EXEC は、他の StoredProcedure 呼び出しのように、他のスコープを開始します。他のスコープでは、@variables は利用できません。一時テーブルは参照できますが、メモリ テーブルや変数は参照できません。

これらの行を次のように変更します。

SET @SQL += 'AND ProductID = @ProductID'

このようなものに(これは少し醜いです):

SET @SQL += 'AND ProductID = ' + CAST(@ProductID as varchar(20))

また

sq_executesqlを見てください。これにより、パラメーターと値をパラメーターに定義できます。多くのアドホック クエリで SQL プロファイラをチェックすると、エンジンは同じことを行っています。sp_executesql とパラメーターを使用して、入力を動的 SQL として実行するだけです。

于 2012-08-29T09:08:20.610 に答える
0

1=1の後にスペースが必要です

'SELECT *,(Select Section From Sections Where SectionID = Products.SectionID) as Section,(Select Category From Categories Where CategoryID = Products.CategoryID) as Category FROM Products WHERE 1 = 1 '; 
于 2012-08-29T08:54:49.653 に答える