2013-01-25 46 views
0

我想從查詢中選擇的表中獲取所有字段,即使字段中不包含任何值(值爲null或空值)。以下是我寫的查詢。如何獲取sql server 2008中的所有字段

SELECT (
      SELECT T1.[CarrierCode_Destination] AS '@CarrierCode_Destination', 
        T1.[CarrierCode_Destination_Address] AS 
        '@CarrierCode_Destination_Address', 
        T1.[CarrierCode_Destination_Address1] AS 
        '@CarrierCode_Destination_Address1', 
        T1.[CarrierCode_Destination_Address2] AS 
        '@CarrierCode_Destination_Address2', 
        T1.[CIMtrek_RegContact] AS '@CIMtrek_RegContact', 
        T1.[CIMtrek_CarrierContact] AS '@CIMtrek_CarrierContact', 
        [T1].[CIMtrek_AdditionalContacts] AS 
        '@CIMtrek_AdditionalContacts' 
      FROM (
         SELECT CD.[CIMtrek_DestinationName] 
          CarrierCode_Destination, 
          CD.[CIMtrek_DestinationAdd] 
          CarrierCode_Destination_Address, 
          CD.[CIMtrek_DestinationAdd_1] 
          CarrierCode_Destination_Address1, 
          CD.[CIMtrek_DestinationAdd_2] 
          CarrierCode_Destination_Address2, 
          CD.[CIMtrek_RegContact] CIMtrek_RegContact, 
          CD.[CIMtrek_CarrierContact] CIMtrek_CarrierContact, 
          CD.[CIMtrek_AdditionalContacts] 
          CIMtrek_AdditionalContacts 
         FROM CIMtrek_SystemTable_DatawareHouse CD 
         WHERE LEN(
           LTRIM(
            RTRIM(ISNULL(LTRIM(RTRIM(CD.[CIMtrek_DestinationName])), '')) 
           ) 
          ) != 0 
       ) AS T1 
        FOR XML PATH('Record'), 
        TYPE 
     ) FOR XML PATH('CarrierCode_Destination'), 
     TYPE 

結果我得到的是

<CarrierCode_Destination> 
    <Record CarrierCode_Destination="8S - San Fran" CarrierCode_Destination_Address="SAN FRANCISCO - Redistribution" CarrierCode_Destination_Address1="4025 Whipple Road, " CarrierCode_Destination_Address2="Union City CA 94587" CIMtrek_RegContact="RDC San Francisco" /> 
    <Record CarrierCode_Destination="8G - St Louis" CarrierCode_Destination_Address="ST. LOUIS - Redistribution" CarrierCode_Destination_Address1="126 Enterprise Drive, " CarrierCode_Destination_Address2="Wentzville MO 63385" CIMtrek_RegContact="RDC St Louis" /> 
    <Record CarrierCode_Destination="V8  PHO/CYPR/CUST/TL  " /> 
</CarrierCode_Destination> 

,但我想所有這一切都在查詢中選擇的字段。如果你看到結果,它會給我有價值的字段,並省略沒有值的字段。

如何做到這一點,請大家幫忙。

問候

+0

你檢查空值不會產生屬性你可以先強制所有空值從選擇對你的原始數據表中返回NULL問題:HTTP://計算器。 com/questions/4402703/t-sql-2005-passing-null-values-through-xml-datatype? – heikkim

+0

有一個['XSINIL'選項](http://msdn.microsoft.com/en-us/library/ms190922.aspx),但它只能用'ELEMENTS'指定,我認爲它會改變形狀您的查詢 –

回答

1

如果你使用你選擇的每一列isnull()報表和轉換空值空字符串應該強制屬性生成爲所有列。您可能會或可能不會還需要添加rtrim()語句就像我在下面取決於如果您有這是否會返回一個固定大小的字符串數據類型上:

SELECT (
     SELECT rtrim(isnull(T1.[CarrierCode_Destination],'')) AS '@CarrierCode_Destination', 
       rtrim(isnull(T1.[CarrierCode_Destination_Address],'')) AS 
       '@CarrierCode_Destination_Address', 
       rtrim(IsNull(T1.[CarrierCode_Destination_Address1],'')) AS 
       '@CarrierCode_Destination_Address1', 
       rtrim(IsNull(T1.[CarrierCode_Destination_Address2],'')) AS 
       '@CarrierCode_Destination_Address2', 
       rtrim(IsNull(T1.[CIMtrek_RegContact],'')) AS '@CIMtrek_RegContact', 
       rtrim(IsNull(T1.[CIMtrek_CarrierContact],'')) AS '@CIMtrek_CarrierContact', 
       rtrim(IsNull([T1].[CIMtrek_AdditionalContacts],'')) AS 
       '@CIMtrek_AdditionalContacts' 
     FROM (
        SELECT CD.[CIMtrek_DestinationName] 
         CarrierCode_Destination, 
         CD.[CIMtrek_DestinationAdd] 
         CarrierCode_Destination_Address, 
         CD.[CIMtrek_DestinationAdd_1] 
         CarrierCode_Destination_Address1, 
         CD.[CIMtrek_DestinationAdd_2] 
         CarrierCode_Destination_Address2, 
         CD.[CIMtrek_RegContact] CIMtrek_RegContact, 
         CD.[CIMtrek_CarrierContact] CIMtrek_CarrierContact, 
         CD.[CIMtrek_AdditionalContacts] 
         CIMtrek_AdditionalContacts 
        FROM CIMtrek_SystemTable_DatawareHouse CD 
        WHERE LEN(
          LTRIM(
           RTRIM(ISNULL(LTRIM(RTRIM(CD.[CIMtrek_DestinationName])), '')) 
          ) 
         ) != 0 
      ) AS T1 
       FOR XML PATH('Record'), 
       TYPE 
    ) FOR XML PATH('CarrierCode_Destination'), 
    TYPE 

這工作對我來說,當我測試了它,但如果你也有使用NULLIF()

SELECT (
     SELECT rtrim(isnull(T1.[CarrierCode_Destination],'')) AS '@CarrierCode_Destination', 
       rtrim(isnull(T1.[CarrierCode_Destination_Address],'')) AS 
       '@CarrierCode_Destination_Address', 
       rtrim(IsNull(T1.[CarrierCode_Destination_Address1],'')) AS 
       '@CarrierCode_Destination_Address1', 
       rtrim(IsNull(T1.[CarrierCode_Destination_Address2],'')) AS 
       '@CarrierCode_Destination_Address2', 
       rtrim(IsNull(T1.[CIMtrek_RegContact],'')) AS '@CIMtrek_RegContact', 
       rtrim(IsNull(T1.[CIMtrek_CarrierContact],'')) AS '@CIMtrek_CarrierContact', 
       rtrim(IsNull([T1].[CIMtrek_AdditionalContacts],'')) AS 
       '@CIMtrek_AdditionalContacts' 
     FROM (
        SELECT NullIF(CD.[CIMtrek_DestinationName],'') 
         CarrierCode_Destination, 
         NullIF(CD.[CIMtrek_DestinationAdd],'') 
         CarrierCode_Destination_Address, 
         NullIF(CD.[CIMtrek_DestinationAdd_1],'') 
         CarrierCode_Destination_Address1, 
         NullIF(CD.[CIMtrek_DestinationAdd_2],'') 
         CarrierCode_Destination_Address2, 
         NullIF(CD.[CIMtrek_RegContact],'') CIMtrek_RegContact, 
         NullIF(CD.[CIMtrek_CarrierContact],'') CIMtrek_CarrierContact, 
         NullIF(CD.[CIMtrek_AdditionalContacts],'') 
         CIMtrek_AdditionalContacts 
        FROM CIMtrek_SystemTable_DatawareHouse CD 
        WHERE LEN(
          LTRIM(
           RTRIM(ISNULL(LTRIM(RTRIM(CD.[CIMtrek_DestinationName])), '')) 
          ) 
         ) != 0 
      ) AS T1 
       FOR XML PATH('Record'), 
       TYPE 
    ) FOR XML PATH('CarrierCode_Destination'), 
    TYPE 
+0

太好了,感謝您的文章日誌,它的工作 –

0

我通常使用的語法如下:

SELECT * 
FROM TABLE_NAME 
WHERE FIELD_NAME = "CRITERIA" 
+0

標準哎呀抱歉錯字 – Zeddy

相關問題