SQL生成的连接使用VARCHAR转换小数

时间:2017-12-12 03:48:33

标签: c# sql sql-server

我在C#中有一个SQL Generator,它允许用户传入指定要加入的表的参数,以及要加入的键。

鉴于灵活性以及SQL有时没有适当地投射字段这一事实,查询最终如下:

SELECT * FROM [SourceTable] AS [src]
INNER JOIN [JoinTable] [join1] ON CAST([join1].[someField] AS VARCHAR(5000)) = CAST([src].[otherFIeld] AS VARCHAR(5000))
WHERE [blah] = 'blah'

这已经工作了很长时间,直到需要将someField上的JoinTable列从浮点数更改为小数。所以现在我们得到'1234' = '1234'而不是'1234.00000000000' = '1234'按预期工作,而当然失败了。

阻止我快速修复的最大问题是那些字段不一定是数字。他们可以很好地传递加入lastName或其他东西的字段,因此我不能只是TRY_CONVERT浮动或其他东西。

第二个问题是这是一个连接,而不仅仅是一个选择,所以我不知道在连接中放置一堆逻辑的影响,或者甚至可能。否则我想知道我是否可以进行IsNumeric类型检查,如果是,则tryconvert为float,然后转换为varchar,否则只是转换为varchar?

我们在2014年至2016年之间使用SQL Server

2 个答案:

答案 0 :(得分:1)

SELECT * FROM [SourceTable] AS [src] 
    INNER JOIN [JoinTable] [join1] 
    ON (CASE WHEN isnumeric('join1].[someField]')=1 
        then  CAST(CAST([join1].[someField] AS FLOAT) AS VARCHAR(50))
         ELSE 
             CAST([join1].[someField] AS varchar(50)) end) = 
      (CASE WHEN isnumeric([src].[otherFIeld])=1 then  CAST(CAST([src].
      [otherFIeld] AS FLOAT) AS VARCHAR(50)) 
       ELSE  CAST([src].[otherFIeld] AS varchar(50)) end)
      WHERE [blah] = 'blah'

答案 1 :(得分:0)

  

否则我想知道我是否可以进行IsNumeric类型检查,如果是的话   ,tryconvert浮动,然后转换为varchar,否则只是转换为   VARCHAR?

是的,你必须完全像this.cast那样连接到同一数据类型。

SELECT * FROM [SourceTable] AS [src]
INNER JOIN [JoinTable] [join1] ON CAST([join1].[someField] AS VARCHAR(5000)) = CAST([src].[otherFIeld] AS VARCHAR(5000))
WHERE [blah] = 'blah' and ISNUMERIC([join1].[someField])=0 and ISNUMERIC([src].[otherFIeld])=0
union ALL
SELECT * FROM [SourceTable] AS [src]
INNER JOIN [JoinTable] [join1] ON CAST([join1].[someField] AS float) = CAST([src].[otherFIeld] AS float)
WHERE [blah] = 'blah' and ISNUMERIC([join1].[someField])=1 and ISNUMERIC([src].[otherFIeld])=1

declare @i decimal(10,4)=1234
declare @ii varchar(400)='1234'
--this won't work
select cast(@i as varchar(400)),@ii
-- this will work
select cast(@i as float),@ii