我有一个动态 SQL SP,它作用于动态创建的表。
该 SP 动态生成的特定查询如下所示:
SELECT * FROM [DYNAMIC_TABLE] WHERE [RATE] BETWEEN '0.0' AND '10.0'
请注意,该列[RATE]的类型为Float。
[RATE]但是,对于列类型为 的另一个动态创建的表,相同的查询失败Int。我知道这是因为参数周围的单引号。
这种行为差异的原因是什么?
我有一个动态 SQL SP,它作用于动态创建的表。
该 SP 动态生成的特定查询如下所示:
SELECT * FROM [DYNAMIC_TABLE] WHERE [RATE] BETWEEN '0.0' AND '10.0'
请注意,该列[RATE]的类型为Float。
[RATE]但是,对于列类型为 的另一个动态创建的表,相同的查询失败Int。我知道这是因为参数周围的单引号。
这种行为差异的原因是什么?
您正在强制进行隐式转换以使数据类型匹配。这都是关于类型优先级的
对于一float列,我们有数据类型float和varchar. float获胜,我们尝试将'0.0'and转换'10.0'为floats 并成功。
对于一int列,我们有数据类型int和varchar. int获胜,我们尝试将'0.0'and转换'10.0'为ints 并失败。
如果没有引号,对于一int列,我们有数据类型int和decimal. decimal获胜,我们尝试将int列值转换为decimal并成功。
尝试将值“0.0”和“10.0”转换/转换为 int
对于 [Rate] 是浮动
SELECT * FROM [DYNAMIC_TABLE] WHERE [RATE] BETWEEN '0.0' AND '10.0'
对于 [Rate] 是 Int
SELECT * FROM [DYNAMIC_TABLE] WHERE [RATE] BETWEEN convert(int, '0.0') AND convert(int, '10.0')'
或者
SELECT * FROM [DYNAMIC_TABLE] WHERE convert(float, [RATE]) BETWEEN '0.0' AND '10.0'