我有一个动态 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'
为float
s 并成功。
对于一int
列,我们有数据类型int
和varchar
. int
获胜,我们尝试将'0.0'
and转换'10.0'
为int
s 并失败。
如果没有引号,对于一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'