变量存储过程中的Where子句

时间:2013-11-26 17:54:10

标签: sql sql-server stored-procedures

我正在尝试使用具有许多可能where子句的存储过程。我现有的存储过程现在返回“关键字'附近的错误语法'作为错误。

Select @SQL = 'SELECT Table1.Col1, Table2.Col2 
FROM Table1
INNER JOIN Table2 on Table1.Col1 = Table2.Col1
WHERE ' + @where

Exec(@SQL)

@Where会像

'Table1.Col1 = 'Apples' OR Table1.Col1 = 'BANNANAS' OR Table2.Col2 = 'CHOCOLATE''

编辑: 在弄乱了所有的建议后,我能够让它运行没有错误。现在它不会返回任何结果。

4 个答案:

答案 0 :(得分:4)

你的问题可能是你需要加倍引用所有的文字吗?

'Table1.Col1 = ''Apples'' OR Table1.Col1 = ''BANNANAS'' OR Table2.Col2 = ''CHOCOLATE'''

答案 1 :(得分:0)

使用char(39)作为引号。

'Table1.Col1 = '+char(39)+Apples+char(39)+' OR Table1.Col1 = '+ Char(39)+BANNANAS+char(39)+' OR Table2.Col2 = '+char(39)+CHOCOLATE+char(39)'

答案 2 :(得分:0)

这是另一种解决方案。

它不是“动态sql”,但它是灵活的,“更清洁”的恕我直言。

Use Northwind
GO

declare @holder table (ProductName nvarchar(40))


Insert into @holder (ProductName )
select
'Chai' union all select 'Chang' union all select 'Aniseed Syrup'

SELECT 
        [ProductID]
      ,[ProductName]
      ,[SupplierID]
      ,[CategoryID]
      ,[QuantityPerUnit]
      ,[UnitPrice]
      ,[UnitsInStock]
      ,[UnitsOnOrder]
      ,[ReorderLevel]
      ,[Discontinued]
FROM 
  [dbo].[Products] prod
  where
        exists (select null from @holder innerH where innerH.ProductName = prod.ProductName)


declare @holderCOUNT int
select @holderCOUNT = count(*) from @holder


SELECT 
        [ProductID]
      ,[ProductName]
      ,[SupplierID]
      ,[CategoryID]
      ,[QuantityPerUnit]
      ,[UnitPrice]
      ,[UnitsInStock]
      ,[UnitsOnOrder]
      ,[ReorderLevel]
      ,[Discontinued]
FROM 
  [dbo].[Products] prod
  where
    ( @holderCOUNT = 0 OR ( exists (select null from @holder innerH where innerH.ProductName = prod.ProductName)  ))

delete from @holder
select @holderCOUNT = count(*) from @holder

SELECT 
        [ProductID]
      ,[ProductName]
      ,[SupplierID]
      ,[CategoryID]
      ,[QuantityPerUnit]
      ,[UnitPrice]
      ,[UnitsInStock]
      ,[UnitsOnOrder]
      ,[ReorderLevel]
      ,[Discontinued]
FROM 
  [dbo].[Products] prod
  where
    ( @holderCOUNT = 0 OR ( exists (select null from @holder innerH where innerH.ProductName = `enter code here`prod.ProductName)  ))

答案 3 :(得分:-1)

只是猜测,但是你应该为变量“@Where”使用不同的名称。

顺便说一句,从字符串中进行这种构建查询并不是一个好习惯。性能,安全性和所有这些问题。

安德烈