我在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
答案 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