2014-02-28 47 views
-3

工作我有这样的代码:SQL Server查询未在德尔福

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 ('[email protected]+') 

) as pvt 
) as src2 
UNPIVOT 
(
    Quantity FOR ItemID in ('[email protected]+') 
) as unpvt 

' 

execute(@sql) 

错误是附近有语法错误“2”:它从WHERE语句..但我试图运行在SQL Server验证码2008 r2 ..及其工作正常..但是当我在我的delphi程序中使用此..出现此错误..请帮助。

+2

您在Delphi中如何运行此代码?请注意,你需要一些'处理 – Kromster

+3

你没有提供任何有关你如何在Delphi代码中使用它的信息。如果您不发布Delphi代码,我们无法帮助您解决Delphi代码的问题。 “我的头很疼,这是我的脚的图片,为什么我的头受伤了?”这不是一个可以回答的问题。 –

+0

首先尝试SSMS中的SQL以确保它是正确的。例如,使用'],@top中的['不适合我。其他一些观点 - 如果DateFinalize是日期时间,那么你不需要转换。我建议你总是用yyyymmdd格式指定日期。在大多数情况下,你也不需要[]周围的名字。 –

回答

1

问题在于日期附近的加号引号。

如果您在运行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 (''[email protected]+'')' 
+ #13#10'' 
+ #13#10') as pvt' 
+ #13#10') as src2' 
+ #13#10'UNPIVOT' 
+ #13#10'(' 
+ #13#10' Quantity FOR ItemID in (''[email protected]+'')' 
+ #13#10') as unpvt' 
+ #13#10'' 
+ #13#10'''' 
+ #13#10'' 
+ #13#10'execute(@sql)'; 

我有一个实用程序,我写的只是做这些转换。上面的代码是该实用程序的输出。

因此,在这种情况下,日期左右的引号加倍,所有其他引号也是如此。

+0

是的,我设置它的方式...对不起,我forgat发布我的解决方案..但谢谢.. – DarrelAbello