Sql server sql server查询在delphi中不起作用

Sql server sql server查询在delphi中不起作用,sql-server,delphi,Sql Server,Delphi,我有以下代码: DECLARE @top VARCHAR(2000) DECLARE @sql VARCHAR(4000) SELECT @top =STUFF((SELECT DISTINCT '],['+ ltrim([itemID]) FROM ARInvDet ORDER BY '],['+ ltrim([itemID]) FOR XML PATH('')

我有以下代码:

DECLARE @top VARCHAR(2000)
DECLARE @sql VARCHAR(4000)
SELECT @top =STUFF((SELECT DISTINCT
                '],['+ ltrim([itemID])
                FROM ARInvDet 
                ORDER BY '],['+ ltrim([itemID])
                FOR XML PATH('')
                ), 1, 2, '')+']'


SET @sql ='
SELECT ItemID,Quantity,Price FROM(
select * From (
select 
a.CustomerID as [CustomerID],
a.DateFinalize as [Date],
ad.Quantity as [Quantity],
ad.UnitPrice as [Price],
i.ItemTypeID as [ItemTypeID],
i.ItemID as [ItemID]
from ARInvDMS a 
inner join ARInvDet ad on a.ARInvoiceID = ad.ARInvoiceID
inner join item i on ad.ItemID = i.ItemID
WHERE CustomerID = 10056 and a.[DateFinalize] = CONVERT(DATETIME,''2/28/2014'', 102)
and i.[ItemTypeID] = 1
) src

PIVOT 
(
    SUM(Quantity)
    FOR [ItemID] in ('+@top+')

) as pvt
) as src2
UNPIVOT
(
    Quantity FOR ItemID in ('+@top+')
) as unpvt

'

execute(@sql)

“2”附近的语法不正确:它来自WHERE语句。。但是我试着在SQLServer2008R2中运行这段代码,它运行得很好。。但是当我在我的delphi程序中使用它时。。出现此错误。。请帮助。

问题在于日期前后的双引号

如果您在SQL Server中完全按照此处显示的方式运行此查询,它将阻塞

''2/28/2014''
因为它需要用单引号括起来

'2/28/2014'
现在,让我们讨论如何从Delphi运行此查询。 是否在设计时将此文本放入查询对象?
或者在程序中使用它作为字符串常量

如果您只是在设计时设置SQL文本,那么在更正双引号后,可以直接按原样输入原始查询

如果使用字符串常量,则需要将每个引号加倍:

const 
  sqlSCRIPTXXX = 
        'DECLARE @top VARCHAR(2000)'
+ #13#10'DECLARE @sql VARCHAR(4000)'
+ #13#10'SELECT @top =STUFF((SELECT DISTINCT'
+ #13#10'                ''],[''+ ltrim([itemID])'
+ #13#10'                FROM ARInvDet '
+ #13#10'                ORDER BY ''],[''+ ltrim([itemID])'
+ #13#10'                FOR XML PATH('''')'
+ #13#10'                ), 1, 2, '''')+'']'''
+ #13#10''
+ #13#10''
+ #13#10'SET @sql ='''
+ #13#10'SELECT ItemID,Quantity,Price FROM('
+ #13#10'select * From ('
+ #13#10'select '
+ #13#10'a.CustomerID as [CustomerID],'
+ #13#10'a.DateFinalize as [Date],'
+ #13#10'ad.Quantity as [Quantity],'
+ #13#10'ad.UnitPrice as [Price],'
+ #13#10'i.ItemTypeID as [ItemTypeID],'
+ #13#10'i.ItemID as [ItemID]'
+ #13#10'from ARInvDMS a '
+ #13#10'inner join ARInvDet ad on a.ARInvoiceID = ad.ARInvoiceID'
+ #13#10'inner join item i on ad.ItemID = i.ItemID'
+ #13#10'WHERE CustomerID = 10056 and a.[DateFinalize] = CONVERT(DATETIME,''2/28/2014'', 102)'
+ #13#10'and i.[ItemTypeID] = 1'
+ #13#10') src'
+ #13#10''
+ #13#10'PIVOT '
+ #13#10'('
+ #13#10'    SUM(Quantity)'
+ #13#10'    FOR [ItemID] in (''+@top+'')'
+ #13#10''
+ #13#10') as pvt'
+ #13#10') as src2'
+ #13#10'UNPIVOT'
+ #13#10'('
+ #13#10'    Quantity FOR ItemID in (''+@top+'')'
+ #13#10') as unpvt'
+ #13#10''
+ #13#10''''
+ #13#10''
+ #13#10'execute(@sql)';
我有一个工具,我写的只是做这些转换。上面的代码是该实用程序的输出


因此,在本例中,日期前后的引号加倍,所有其他引号也是如此

如何在Delphi中运行此代码?请注意,您需要一些“处理”,因为您没有提供有关如何在Delphi代码中使用此功能的信息。如果您不发布Delphi代码,我们无法帮助您解决Delphi代码的问题。“我的头很痛。这是我的脚的图片。为什么我的头会痛?”这不是一个可以回答的问题。请先尝试SSMS中的SQL以确保它是正确的。例如,在@top中使用“],[”对我来说并不合适。其他一些观点-如果DateFinalize是datetime,那么您不需要转换。我建议您总是以yyyymmdd格式指定日期。而且在大多数情况下,您不需要在名称周围使用[]。是的,我这样设置了……很抱歉,我放弃发布我的解决方案……但是谢谢。。