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

餐厅Dish

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 回答