0

私はこのストアドプロシージャを書きました:

CREATE PROCEDURE [dbo].[spGetCuisines]
    @RestaurantID INT ,
    @CuisineID NVARCHAR(200)
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql NVARCHAR(MAX)

    SET @sql = 'SELECT  CuisineID, CuisineName
    FROM    dbo.Cuisine1
    WHERE   CuisineID IN (
            SELECT  dbo.Dishes1.CuisineID
            FROM    dbo.Dishes1
            WHERE   DishID IN ( SELECT  DishID
                                FROM    dbo.RestaurantDish
                                WHERE   RestaurantID = '
        + CAST(@RestaurantID AS NVARCHAR(MAX)) + ' ) )'                                    
    IF @CuisineID <> ''
        BEGIN
            SET @sql += 'AND Cuisine1.CuisineID IN('
                + CAST(@CuisineID AS NVARCHAR(MAX)) +')'
        END
    EXECUTE sp_executesql @sql; 
END

以下にリストされている列を持つ3つのテーブルを使用しています。

料理1

   DishID
   DishName
   CuisineID
   Price 

料理1

   CuisineID
   CuisineName
   Type
   DateCreated
   DateModified
   DateDeleted

レストラン料理

RestaurantDishID
RestaurantID
DishID

しかし、私のストアドプロシージャは、次の行で構文エラーを出します:

    SET @sql += 'AND Cuisine1.CuisineID IN('+ CAST(@CuisineID AS NVARCHAR(MAX)) +')'

それは言います:

「+」付近の構文が正しくありません

誰かが私を案内できますか?SQL Server のバージョンはこれと関係がありますか?

4

3 に答える 3

1

使用している構文は、SQL Server 2008 以降でのみ有効です。SQL Server 2005 では、以下を変更する必要があります。

SET @sql += ...

に:

SET @sql = @sql + ...
于 2013-01-30T06:31:38.313 に答える
1

ここで動的 SQL を使用する必要はまったくありません。使用しないでください。また、サブクエリよりもJOINを優先してください。通常、結合は高速であり、率直に言って、コードははるかに読みやすいです。

使用するだけです:

CREATE PROCEDURE [dbo].[spGetCuisines]
    @RestaurantID INT ,
    @CuisineID NVARCHAR(200)
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql NVARCHAR(MAX)

    SELECT  
        c.CuisineID, c.CuisineName
    FROM    
        dbo.Cuisine1 c
    INNER JOIN
        dbo.Dishes1 d ON d.CuisineID = c.CuisineID
    INNER JOIN
        dbo.Restaurant1 r ON r.DishID = d.DishID
    WHERE  
        r.RestaurantID = @RestaurantID
        AND (@CuisineID = '' OR c.CuisineID = @CuisineID)
END

もちろん、Aaron Bertrand は完全に正しいです。これは、単一の文字列を渡した場合にのみ機能CuisineIDします。

パラメータに複数の値が含まれている場合@CuisineIDは、代わりに次のようなものが必要です。

    WHERE  
        r.RestaurantID = @RestaurantID
        AND (@CuisineID = '' OR c.CuisineID IN dbo.Split(@CuisineID))

関数Splitを使用すると、カンマ区切りの ID のリストをテーブル変数に分割し、IN演算子を使用して可能な値のリストに一致させることができます。

于 2013-01-30T06:32:38.193 に答える
0

おそらくカンマ区切りの文字列を渡していますか?? その場合、これを処理するより良い方法があります。こちらを参照してください。

http://codebetter.com/raymondlewallen/2005/10/26/quick-t-sql-to-parse-a-delimited-string/

于 2013-01-30T06:32:40.880 に答える