【问题标题】:Problem with cast convert and view all in TSQL在 SQL 中转换和查看全部的问题
【发布时间】:2010-07-21 12:56:28
【问题描述】:

我有一个名为 vw_FormatTable1 的视图,其中包含

Convert( CHAR ( <SIZE> ), Coalesce (Convert (VarChar, [<FIELD>],120),'')) AS [<FIELD>]

其中&lt;SIZE&gt; 是要输出的字段的宽度,&lt;FIELD&gt; 是字段名称

这个基本块在我的基表中的所有大约 600 个字段中重复,创建了一个超过 50,000 个字符的视图。

我的问题如下:

select 
  [CC_RENAL_SUPPORT_DAYS_1],
  CONVERT(CHAR(3), COALESCE(CONVERT(VARCHAR, [CC_RENAL_SUPPORT_DAYS_1]), '')) AS [CC_RENAL_SUPPORT_DAYS_SPC]
from Table1
group by [CC_RENAL_SUPPORT_DAYS_1]

产生不同的结果

select 
   [CC_RENAL_SUPPORT_DAYS_1],
   CONVERT(CHAR(3), COALESCE(CONVERT(VARCHAR, [CC_RENAL_SUPPORT_DAYS_1]),'')) AS [CC_RENAL_SUPPORT_DAYS_SPC]
from vw_FormatTable1
group by [CC_RENAL_SUPPORT_DAYS_1]

我不知道为什么?

第一个输出是

[CC_RENAL_SUPPORT_DAYS_1]     [CC_RENAL_SUPPORT_DAYS_SPC]
--------------------------    --------------------------
001                           001
002                           002

而第二个输出是

[CC_RENAL_SUPPORT_DAYS_1]     [CC_RENAL_SUPPORT_DAYS_SPC]
--------------------------    --------------------------
1                             1
2                             2

包含 120 不会导致此错误(因为我做了一些有和没有它的基本测试,但没有任何区别)

谁能回答:

  • 为什么我会丢失前导零
  • 为什么不能在我的第一个 SQL 语句中复制结果?
  • 视图有大小限制吗?

提前致谢,

高烧


视图的 sn-p 是:

ALTER View [dbo].[vw_ver2_InpatientsLong_ReadyToExport] AS select top 100 percent Convert(CHAR(6),coalesce(convert(varchar,[PRIME RECIPIENT],120),'')) AS [PRIME RECIPIENT], Convert(CHAR(6),coalesce(convert(varchar,[COPY RECIPIENT 1],120),'')) AS [COPY RECIPIENT 1], Convert(CHAR(6),coalesce(convert(varchar,[COPY RECIPIENT 2],120),'')) AS [COPY RECIPIENT 2], Convert(CHAR(6),coalesce(convert(varchar,[COPY RECIPIENT 3],120),'')) AS [COPY RECIPIENT 3], Convert(CHAR(6),coalesce(convert(varchar,[COPY RECIPIENT 4],120),'')) AS [COPY RECIPIENT 4], Convert(CHAR(6),coalesce(convert(varchar,[COPY RECIPIENT 5],120),'')) AS [COPY RECIPIENT 5], Convert(CHAR(5),coalesce(convert(varchar,[SENDER],120),'')) AS [SENDER], Convert(CHAR(3),coalesce(convert(varchar,[CDS_GROUP],120),'')) AS [CDS GROUP], Convert(CHAR(3),coalesce(convert(varchar,[CDS_TYPE],120),'')) AS [CDS TYPE], Convert(CHAR(35),coalesce(convert(varchar,[CDS_ID],120),'')) AS [CDS_ID], Convert(CHAR(1),coalesce(convert(varchar,[TEST_FLAG],120),'')) AS [TEST_FLAG], Convert(CHAR(1),coalesce(convert(varchar,[UPDATE TYPE],120),'')) AS [UPDATE TYPE], Convert(CHAR(3),coalesce(convert(varchar,[PROTOCOL IDENTIFIER],120),'')) AS [PROTOCOL IDENTIFIER], Convert(CHAR(10),coalesce(convert(varchar,[BULKSTART],120),'')) AS [BULKSTART], Convert(CHAR(10),coalesce(convert(varchar,[BULKEND],120),'')) AS [BULKEND], Convert(CHAR(16),coalesce(convert(varchar,[DATETIME_CREATED],120),'')) AS [DATETIME_CREATED], Convert(CHAR(5),coalesce(convert(varchar,[PROVIDER],120),'')) AS [PROVIDER], Convert(CHAR(5),coalesce(convert(varchar,[PURCHASER],120),'')) AS [PURCHASER], Convert(CHAR(6),coalesce(convert(varchar,[SERIAL_NO],120),'')) AS [SERIAL_NO], Convert(CHAR(10),coalesce(convert(varchar,[CONTRACT_LINE_NO],120),'')) AS [CONTRACT_LINE_NO], Convert(CHAR(17),coalesce(convert(varchar,[PURCH_REF],120),'')) AS [PURCH_REF], Convert(CHAR(17),coalesce(convert(varchar,[NHS_NO],120),'')) AS [NHS_NO], Convert(CHAR(2),coalesce(convert(varchar,[NNN_STATUS_IND],120),'')) AS [NNN_STATUS_IND], Convert(CHAR(1),coalesce(convert(varchar,[name_format],120),'')) AS [name_status], Convert(CHAR(1),coalesce(convert(varchar,[address_format],120),'')) AS [address_status], Convert(CHAR(70),coalesce(convert(varchar,[NAME],120),'')) AS [NAME], Convert(CHAR(35),coalesce(convert(varchar,[FORENAME],120),'')) AS [FORENAME], Convert(CHAR(35),coalesce(convert(varchar,[HOMEADD1],120),'')) AS [HOMEADD1], Convert(CHAR(35),coalesce(convert(varchar,[HOMEADD2],120),'')) AS [HOMEADD2], Convert(CHAR(35),coalesce(convert(varchar,[HOMEADD3],120),'')) AS [HOMEADD3], Convert(CHAR(35),coalesce(convert(varchar,[HOMEADD4],120),'')) AS [HOMEADD4], Convert(CHAR(35),coalesce(convert(varchar,[HOMEADD5],120),'')) AS [HOMEADD5], Convert(CHAR(8),coalesce(convert(varchar,[POSTCODE],120),'')) AS [POSTCODE], Convert(CHAR(3),coalesce(convert(varchar,[HA],120),'')) AS [HA], Convert(CHAR(1),coalesce(convert(varchar,[SEX],120),'')) AS [SEX], Convert(CHAR(2),coalesce(convert(varchar,[CARER_SUPPORT_IND],120),'')) AS [CARER_SUPPORT_IND], Convert(CHAR(10),coalesce(convert(varchar,[DOB],120),'')) AS [DOB], Convert(CHAR(8),coalesce(convert(varchar,[GPREG],120),'')) AS [GPREG], Convert(CHAR(6),coalesce(convert(varchar,[PRACREG],120),'')) AS [PRACREG], Convert(CHAR(2),coalesce(convert(varchar,[ETHNICOR],120),'')) AS [ETHNICOR], Convert(CHAR(10),coalesce(convert(varchar,[LOCPATID],120),'')) AS [LOCPATID], Convert(CHAR(8),coalesce(convert(varchar,[REFERRER],120),'')) AS [REFERRER], Convert(CHAR(6),coalesce(convert(varchar,[REF_ORG],120),'')) AS [REF_ORG], Convert(CHAR(12),coalesce(convert(varchar,[PROV_SPELL],120),'')) AS [PROV_SPELL], Convert(CHAR(2),coalesce(convert(varchar,[ADMIN_CATEGORY],120),'')) AS [ADMIN_CATEGORY], Convert(CHAR(2),coalesce(convert(varchar,[LEGAL_STATUS],120),'')) AS [LEGAL_STATUS],

多行

Convert(CHAR(10),coalesce(convert(varchar,[MOM_NHS_NUM],120),'')) AS [MOM_NHS_NUM], 转换(CHAR(10),coalesce(convert(varchar,[MOM_PAT_ID],120),'')) 作为 [MOM_PAT_ID], 转换(CHAR(5),coalesce(convert(varchar,[MOM_PAT_ID_ORG],120),'')) AS [MOM_PAT_ID_ORG], 转换(CHAR(2),coalesce(convert(varchar,[MOM_NNN_STATUS],120),'')) 作为 [MOM_NNN_STATUS], 转换(CHAR(35),coalesce(convert(varchar,[MOM_USUAL_ADDRESSLINE_1],120),'')) 作为 [MOM_USUAL_ADDRESS_LINE_1], 转换(CHAR(35),coalesce(convert(varchar,[MOM_USUAL_ADDRESSLINE_2],120),'')) 作为 [MOM_USUAL_ADDRESS_LINE_2], 转换(CHAR(35),coalesce(convert(varchar,[MOM_USUAL_ADDRESSLINE_3],120),'')) 作为 [MOM_USUAL_ADDRESS_LINE_3], 转换(CHAR(35),coalesce(convert(varchar,[MOM_USUAL_ADDRESSLINE_4],120),'')) 作为 [MOM_USUAL_ADDRESS_LINE_4], 转换(CHAR(35),coalesce(convert(varchar,[MOM_USUAL_ADDRESSLINE_5],120),'')) 作为 [MOM_USUAL_ADDRESS_LINE_5], 转换(CHAR(8),coalesce(convert(varchar,[MOM_POSTCODE_OF_USUAL_ADDRESS],120),'')) 作为 [MOM_POSTCODE_OF_USUAL_ADDRESS], Convert(CHAR(17),coalesce(convert(varchar,[PROVIDER_REFERENCE_NUMBER],120),'')) AS [PROVIDER REFERENCE NUMBER], Convert(CHAR(5),coalesce(convert(varchar,[ORGANISATION_CODE(LOCAL PAT ID)],120),'')) AS [组织代码(LOCAL PAT ID)], 转换(CHAR(12),coalesce(convert(varchar,[UBRN],120),'')) 作为 [UBRN], 转换(CHAR(20),coalesce(convert(varchar,[CARE_PATHWAY_ID],120),'')) 作为 [CARE_PATHWAY_ID], 转换(CHAR(5),coalesce(convert(varchar,[CARE_PATWAY_ID_ORG],120),'')) 作为 [CARE_PATHWAY_ID_ORG], 转换(CHAR(2),coalesce(convert(varchar,[REF_TO_TREAT_PERIOD_STATUS],120),'')) 作为 [REF_TO_TREAT_PERIOD_STATUS], 转换(CHAR(10),合并(转换(varchar,[REF_TO_TREAT_PERIOD_START_DATE],120),''))作为 [REF_TO_TREAT_PERIOD_START_DATE], 转换(CHAR(10),coalesce(convert(varchar,[REF_TO_TREAT_PERIOD_END_DATE],120),'')) 作为 [REF_TO_TREAT_PERIOD_END_DATE] 来自 tbl_SUS_CDS130

【问题讨论】:

  • @user HTML 表格不受支持。您可以将其粘贴为纯文本然后选择代码并使用代码格式化按钮吗?
  • 我试过了,好点了吗?
  • 您需要向我们展示vw_FormatTable1 的定义,以便进行任何有用的分析!
  • 过于复杂、双重嵌套的 CONVERT 有什么特别的原因吗?难道你不能只使用CONVERT(CHAR(3), COALESCE([CC_RENAL_SUPPORT_DAYS_1], '')) ... 似乎有点没有意义先转换为 VARCHAR 然后再转换为 CHAR(3) ......
  • 为了节省时间,我写了一个通用的转换语句,并复制它(使用 excel)来得出完整的语句。你认为它会影响事情吗?

标签: sql casting


【解决方案1】:

您在查询中所做的任何操作都不会添加/删除前导零,因此它们不能在表中。前导零只能存在于基于字符串的数据类型列中,并且只有当它们被故意放在那里时。

根据所有给定信息,我的最佳猜测是 Table1.CC_RENAL_SUPPORT_DAYS_1 是 char 或 varchar,并且在列中有前导零,而 vw_FormatTable1.[CC_RENAL_SUPPORT_DAYS_1] 是 int(或没有前导零的 char/varchar)。

如果您在第二个查询中需要前导零,请使用:

select 
    [CC_RENAL_SUPPORT_DAYS_1]
        ,RIGHT(ISNULL(REPLICATE('0',3)+CONVERT(VARCHAR, [CC_RENAL_SUPPORT_DAYS_1]),''),3) AS [CC_RENAL_SUPPORT_DAYS_SPC]
    from vw_FormatTable1 
    group by [CC_RENAL_SUPPORT_DAYS_1]

【讨论】:

  • 谢谢你的回答,我错过了表def中的这个字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2021-05-18
相关资源
最近更新 更多