我正在尝试使用具有许多可能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''
编辑: 在弄乱了所有的建议后,我能够让它运行没有错误。现在它不会返回任何结果。
答案 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”使用不同的名称。
顺便说一句,从字符串中进行这种构建查询并不是一个好习惯。性能,安全性和所有这些问题。
安德烈