【问题标题】:Stored procedure causing syntax error存储过程导致语法错误
【发布时间】:2013-01-30 06:25:02
【问题描述】:

我已经写了这个存储过程:

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版本和这个有关系吗?

【问题讨论】:

  • 那么,您使用的是哪个版本的 SQL Server?
  • 另外,你听说过joins吗?
  • 是的。我知道加入。怎么处理他们?
  • 你还需要做演员吗?它已经是 NVARCHAR 了?此外,您的主键不应是最大长度的字符串。

标签: sql sql-server-2005 stored-procedures


【解决方案1】:

您使用的语法仅在 SQL Server 2008 及更高版本上有效。在 SQL Server 2005 上,您必须进行更改:

SET @sql += ...

收件人:

SET @sql = @sql + ...

【讨论】:

    【解决方案2】:

    这里绝对不需要使用动态 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 运算符匹配可能值的列表。

    【讨论】:

    • 仅当 @CuisineID 实际上是一个整数时才为真 - 我怀疑它可能是一个逗号分隔的 ID 列表。
    • @AaronBertrand:你是绝对正确的——但它至少应该引导 OP 朝着正确的方向前进——我希望! :-)
    【解决方案3】:

    您是否可能传入逗号分隔的字符串? 如果是这样,有更好的方法来处理这个问题,请参见此处:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2018-05-12
      • 1970-01-01
      • 2011-04-18
      • 2012-04-12
      • 2014-07-12
      相关资源
      最近更新 更多