2009-11-12 95 views
0

如果使用內置嚮導創建Crystal報表,則會鏈接表等。什麼決定了參數是否使其成爲實際的SQL語句?另外,它爲什麼用雙引號括起所有內容?爲MS SQL生成水晶報表SQL語句

例如:

這裏將是我的基本SQL語句由CR所產生:現在

SELECT "poitem"."fpono" 
,  "pomast"."fcompany" 
,  "pomast"."fvendno" 
,  "poitem"."fpartno" 
,  "poitem"."fitemno" 
,  "poitem"."frelsno" 
,  "poitem"."fordqty" 
,  "poitem"."frcpqty" 
,  "poitem"."fucostonly" 
,  "poitem"."flstpdate" 
FROM "M2MDATA01"."dbo"."pomast" "pomast" 
    INNER JOIN "M2MDATA01"."dbo"."poitem" "poitem" 
    ON "pomast"."fpono" = "poitem"."fpono" 

,看的時候我添加以下到選擇專家編輯會發生什麼:

{poitem.fcategory} = "INV" and 
not ({poitem.fmultirls} = "Y" and 
{poitem.frelsno} = " 0") and 
{poitem.fordqty} > {poitem.frcpqty} and 
cdate({poitem.flstpdate}) = {?LastPromDate} and 
{poitem.forgpdate} = DateTime (2010, 10, 05, 00, 00, 00) and 
{pomast.fstatus} = "OPEN" 

我添加了forgpdate進行比較,因爲我要求日期兩種不同的方式。

這裏是SQL我得到:

SELECT "poitem"."fpono" 
,  "pomast"."fcompany" 
,  "pomast"."fvendno" 
,  "poitem"."fpartno" 
,  "poitem"."fitemno" 
,  "poitem"."frelsno" 
,  "poitem"."fordqty" 
,  "poitem"."frcpqty" 
,  "poitem"."fucostonly" 
,  "poitem"."flstpdate" 
,  "poitem"."fcategory" 
,  "poitem"."fmultirls" 
,  "pomast"."fstatus" 
,  "poitem"."forgpdate" 
FROM "M2MDATA01"."dbo"."pomast" "pomast" 
    INNER JOIN "M2MDATA01"."dbo"."poitem" "poitem" 
    ON "pomast"."fpono" = "poitem"."fpono" 
WHERE  "poitem"."fcategory" = 'INV' 
     AND("poitem"."fmultirls" <> 'Y' 
      OR "poitem"."frelsno" <> ' 0') 
     AND "poitem"."fordqty" > "poitem"."frcpqty" 
     AND("poitem"."forgpdate" >= {TS '2010-10-05 00:00:00'} 
      AND "poitem"."forgpdate" < {TS '2010-10-05 00:00:01'}) 
     AND "pomast"."fstatus" = 'OPEN' 

大部分是直接轉移,但它轉換我的「不」的聲明。

此外,請注意我的cdate行根本沒有發送,但在Crystal本身內解析。

有誰知道水晶究竟該怎麼做?我使用了一些大型數據庫,並且需要SQL語句中的條件,否則Crystal會返回浪費時間,內存和處理的大型數據集。

TIA。

回答

1

它生成的SQL的格式部分取決於Crystal和數據提供者的版本。如果您使用ODBC,它將始終將引號放在所有內容中,因爲此語法是ansi標準。報告SQL Server和其他數據源時通常也適用。但是,例如,如果您在Crystal 8.5中創建報表並使用SQL Server數據源提供程序,則它將生成不帶引號(即只是普通的SELECT MyTable.MyField FROM MyTable)的SQL。我相信,在任何SQL Server數據源的版本9中,這種行爲都發生了變化,但這不是一個全面的變化。在Crystal 11中,對Informix數據源使用本機提供程序而非ODBC將不會像上面那樣生成帶引號的SQL。

至於如何評估在SQL中做什麼,這取決於它可以在數據源的SQL中重寫多少。任何使用Crystal函數的公式(例如您使用過的CDate)通常只能在Crystal自身中進行評估。 要最大限度地提高服務器的性能,請不要使用任何Crystal函數,彙總字段或Switch語句。它可以轉換的確切數量取決於提供商。有時候根本無法將其全部轉換。 還有一個選項可以使服務器上的索引使用速度更快,但對於在哪裏執行的內容並沒有什麼幫助。

1

爲什麼它將所有內容都用雙引號括起來?

雙引號是ansi標準方法來封裝對象名稱。這是確保貴公司的表和列名不會與某個保留關鍵字衝突的安全,跨平臺的方式。

問題的主要部分似乎是爲什麼它做你的變量比較客戶端。我擔心我無法幫助你。我最好的猜測是,這與可用的索引有關,除非Crystal對此知之甚多。

1

如果您使用Command對象而不是單個表,您將擁有對SQL語句的更多控制。數據庫|數據庫專家...,展開所需數據庫服務器的根目錄,然後單擊「添加命令」。輸入所需的SQL語句。根據需要添加參數。

在Command對象中創建的參數比您在報表中定義的參數靈活得多。您可以選擇在Command對象中定義的參數(將自動添加到報告中)定義在報告中的其他參數,這些參數將在報告從數據庫讀取記錄時應用(顯然效率較低)。

+0

當然,只有Crystal 9向上纔可用。並不像服務器端存儲過程那麼快。 – MartW

+0

我明白這一點,通常會這樣做。我在Crystal外寫入所有的SQL,並使用命令對象。但是,我試圖說服員工瞭解這樣做的效率,而不是使用Crystal嚮導。這就是這個問題產生的原因。你知道Crystal如何決定添加到原始SQL語句中的內容嗎? – DavidStein

+0

@CodeByMoonlight:假設SQL語句是相同的,我懷疑存儲過程和'原始'SQL之間的性能差異是非常顯着的。還需要考慮開發和維護SP所需的額外成本和經驗。我更喜歡自己的觀點,至少他們傾向於在多個報告中重複使用。 – craig