1

关于我的问题,我正在尝试这个选择语句并收到错误

Select * From    
(SELECT * FROM  FruitCrate WHERE FruitName IN (' +@FruitNames+ '))

WHERE FruitCrate.Eatable= 1

错误

关键字“WHERE”附近的语法不正确。

编辑

USE [DataBaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[SPName]
(
    @FruitNames
)
AS

exec('SELECT  *  
    FROM FruitCrate
    WHERE FruitName IN (' +@FruitNames+ ')
    and Eatable = 1')
4

4 回答 4

2

您应该如下命名您的子查询

Select * From    
(SELECT * FROM  FruitCrate WHERE FruitName IN (' +@FruitNames+ ')) tab    
WHERE tab.Eatable= 1

你应该使用代码作为动态sql

exec('Select * From    
    (SELECT * FROM  FruitCrate WHERE FruitName IN (' +@FruitNames+ ')) tab    
    WHERE tab.Eatable= 1')

它适用于像这样的列表'apple','strawberry','banana'

Select * From    
(SELECT * FROM  FruitCrate WHERE FruitName IN ('apple','strawberry','banana')) tab    
WHERE tab.Eatable= 1
于 2013-09-09T10:23:33.090 回答
2

您不能将逗号分隔的字符串传递给in操作员。如果您使用 and条件,您只需要 1 个查询。

exec('SELECT * 
      FROM FruitCrate 
      WHERE FruitName IN (' +@FruitNames+ ')
      and FruitCrate.Eatable= 1'

如果你想执行一个你必须使用的动态查询(这里就是这种情况) exec

于 2013-09-09T10:27:26.350 回答
1

尝试这个:

Select * From    
(SELECT * FROM FruitCrate WHERE FruitName IN (' +@FruitNames+ ')) as FruitCrateRes
WHERE FruitCrateRes.Eatable= 1

您使用了表名 FruitCrate 没有重命名 from 子句的子查询输入

于 2013-09-09T10:24:14.257 回答
0

你为什么不使用

SELECT * FROM  FruitCrate WHERE FruitName IN (' +@FruitNames+ ')
WHERE FruitCrate.Eatable= 1

FruitCrate可能,使用您的子查询,SQL 引擎在 last中无法识别WHERE,因为未指定子查询名称。

您的IN条款也可能被滥用!

于 2013-09-09T10:38:46.850 回答