2013-01-25 42 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

相关问题