2014-02-28 88 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