Sql-Server-2000

在具有硬設置長度值的選擇字元串中定義多個欄位 (SQL 2000)

  • September 12, 2017

目前,我的任務是在我們的 SQL 2000 實例中修改一個代表電子郵件輸出的超級舊儲存過程。通過糾正一些語法問題,我希望原始字元串格式在電子郵件中更加形象化。因為欄位“機器”和“零件編號”的欄位數據長度存在差異,因此欄位移位並且列不完全對齊。我一直在嘗試將我的 SQL 程式碼中存在的每個欄位設置為 15 個字元的硬設置值,這樣呈現的每個欄位的格式不會改變/移位,並且直接面向最終使用者。現在我在網上嘗試了一些建議,但找不到設置每個欄位的方法。有任何想法嗎?

INSERT INTO ##prod_performance_txt_out2
              SELECT LEFT(machine + '             ', 9) 
         + LEFT(part_no + '                              ', 30) 
         + LEFT(CONVERT(varchar(7), ordered) + '       ', 7) 
         + LEFT(CONVERT(varchar(7), picked)  + '       ', 7) 
         + LEFT(CONVERT(varchar(7), allocated)  + '       ', 7)
         + LEFT(CONVERT(varchar(7), in_stock)  + '       ', 7) 
         + LEFT(CONVERT(varchar(7), sh_bin_qty)  + '       ', 7)  
         + LEFT(CONVERT(varchar(7), short)  + '       ', 7) 
         + min_bin


              FROM #tempsummary2 WHERE resource = @resource AND short > 0

首先 - 請注意,在 SQL 中執行詳細格式化通常是不受歡迎的,並且“應該留給呼叫應用程序”。當然,這樣的建議會忽略沒有呼叫應用程序的情況。

我認為您提供的查詢中的基本方法沒有問題。在這種情況下,明智的做法是使用特定於應用程序的知識。對於您願意截斷的可變長度值,您需要確定覆蓋大部分數據的長度,並提供足夠的該列來確定它是什麼。對於必須按原樣提供的值(您的數字數據),您需要一個長度來覆蓋該欄位的最大可能值。而且,對於不同的列,這可能會有所不同:quantity表中用於保存經銷商汽車數據的列可能小於同一表中的“總值”列。

如果您使用的硬編碼值需要在多行中使用,您可以將它們放入變數中。

我建議確保您的列之間有“排水溝” - 每列之間有 1-3 個空格有助於保持它們的獨特性和易讀性。由於缺少裝訂線,我很確定您的範例輸出中的“LD-MOLDINLD-”行是一起執行的。

最後,您可能想要翻轉數字列上的填充;如果你改變:

LEFT(CONVERT(varchar(7), ordered) + '       ', 7)

到:

RIGHT('       ' + CONVERT(varchar(7), ordered), 7)

那麼數字將右對齊,這對於數字來說更為典型。


話雖如此,如果您仔細空格輸出沒有使用單空格字型顯示,那麼這些都不會奏效。

查看“MACHINE”、“SHIPPING”和“MOLDINLD”,我懷疑您提供的螢幕截圖輸出沒有使用等距字型。請注意,“MACHINE”(7 個字母)和“SHIPPING”(8 個字母)看起來像是在右側排列(或偏離 1 個像素)。

不了解您的電子郵件程序,我無法確定說服它以這種方式顯示這些數據的最佳方法。對於 HTML 輸出,請嘗試將整個輸出塊包含在<pre><code>標籤中(最後使用適當</code></pre>的結束標籤。事實上,此時在此頁面上已完成(右鍵點擊,選擇“查看原始碼”,然後滾動一條路徑)查看)。

您可以通過複製您截取螢幕截圖的輸出並將其粘貼到設置為使用等寬字型的文本編輯器中來確認這是正確的。

引用自:https://dba.stackexchange.com/questions/185748