【问题标题】:SQL Select Query - Conversion ErrorSQL 选择查询 - 转换错误
【发布时间】:2014-01-12 09:10:40
【问题描述】:

您好,我正在尝试以下查询。其中 ProjectID 的输出为 1,2,3。我正在尝试使用 ProjectID 从其他表中获取数据。

  DECLARE @ProjectID varchar(100)
 DECLARE @ImpactIntakeID varchar(100)

set @ProjectID =
(SELECT STUFF ((SELECT ',' + CAST(Proj_ID AS VARCHAR) FROM PROJECT
 WHERE YEAR(Enter_Dt) < (YEAR(GETDATE-()-7)) FOR XML PATH('')), 1, 1, '') 
AS Enter_Date)

print @ProjectID

set @ImpactIntakeID = 
(SELECT STUFF ((SELECT ',' + CAST([IMPCT_INTAKE_ID] AS VARCHAR) FROM [IMPCT_INTAKE_REQ]
 WHERE [CNSDR_PROJ_ID] in (@ProjectID) FOR XML PATH('')), 1, 1, '') 
 AS ImpactIntakeID)

print @ImpactIntakeID

我收到转换错误。 将 varchar 值“1,2,3”转换为数据类型 int 时转换失败。 我不确定我在哪里缺少转换。下面我也试过了..

 set @ImpactIntakeID = 
(SELECT STUFF ((SELECT ',' + CAST([IMPCT_INTAKE_ID] AS VARCHAR) FROM [IMPCT_INTAKE_REQ]
WHERE [CNSDR_PROJ_ID] in (''+@ProjectID+'') FOR XML PATH('')), 1, 1, '') 
AS ImpactIntakeID)

  set @ImpactIntakeID = 
 (SELECT STUFF ((SELECT ',' + CAST([IMPCT_INTAKE_ID] AS VARCHAR) FROM [IMPCT_INTAKE_REQ]
 WHERE CAST([CNSDR_PROJ_ID] AS VARCHAR) in (@ProjectID) FOR XML PATH('')), 1, 1, '') 
 AS ImpactIntakeID)

任何人都可以在我缺少转换的地方帮忙...

【问题讨论】:

    标签: sql sql-server select where-clause sql-server-group-concat


    【解决方案1】:

    试试这个:

    SET @ImpactIntakeID = 
    (SELECT STUFF ((SELECT ',' + CAST([IMPCT_INTAKE_ID] AS VARCHAR) FROM [IMPCT_INTAKE_REQ]
     WHERE [CNSDR_PROJ_ID] IN (SELECT Proj_ID FROM PROJECT WHERE YEAR(Enter_Dt) < (YEAR(GETDATE()-7))) FOR XML PATH('')), 1, 1, '') 
     AS ImpactIntakeID)
    

    SET @ImpactIntakeID = 
    (SELECT STUFF ((SELECT ',' + CAST([IMPCT_INTAKE_ID] AS VARCHAR) FROM [IMPCT_INTAKE_REQ]
    WHERE ',' + @ProjectID + ',' LIKE '%,' + CONVERT(VARCHAR(20), [CNSDR_PROJ_ID]) + ',%' FOR XML PATH('')), 1, 1, '') 
    AS ImpactIntakeID)
    

    【讨论】:

    • @saravanakumarr 检查我更新的答案。我从GETDATE-() 中删除了-,并将其更改为GETDATE()。它会工作
    • 谢谢吉...它正在工作...但我不知道为什么我的方法会导致转换问题,尽管我将结果分配给变量并在条件下使用它...跨度>
    • @saravanakumarr 不客气。在 IN 子句中,您必须传递具有相同数据类型的所有值。但是在这里你传递字符串数据并与整数数据进行比较。
    【解决方案2】:

    使用Table-Valued User-Defined Function 将逗号分隔的字符串@ProjectID 转换为表中的记录。然后在 Where 子句中使用此表

    WHERE [CNSDR_PROJ_ID] in (SELECT projID from @ResultTable)
    

    表变量 @ResultTable 在 int 类型的列 projID 中包含项目 ID,该列使用链接中给出的用户定义函数填充。

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多