使用C1>之间的区别是什么? sqlserver中检查约束中的'42'和C1> 42

时间:2016-12-09 07:58:46

标签: sql-server

我将check 约束添加到列中,如下所示。使用它的两种方式我得到不同的结果。任何人都能解释一下有什么不同吗?

ALTER TABLE [dbo].[state] WITH CHECK ADD CONSTRAINT [chk_State_partition_42] CHECK ([Code]>='42' AND [Code]<'43')

ALTER TABLE dbo.State WITH CHECK ADD CONSTRAINT [chk_state_partition_42] CHECK ([code]>=42 AND [code]<43)

- 实际上,第二个查询是以下动态sql代码的结果 DECLARE @code varchar(2)='42'     ,@ SQLStr varchar(max)   --SET @SQLStr ='ALTER TABLE dbo.state WITH CHECK ADD CONSTRAINT [chk_state_partition _'+ @ APIState +'] CHECK([code]&gt; ='+ @ APIState +'AND [code]&lt;'+ CAST(CAST(@)代码为int)+1 as varchar(2))+')'  选择@SQLStr

1 个答案:

答案 0 :(得分:1)

SQL Server能够隐式地转换某些类型Find details here

这取决于列Code的数据类型。它是数字的(例如INT),引擎会隐式地将42强制转换为数字。如果没有,比较将在字符串级别完成。

你必须意识到,字母数字比较 - 可能 - 不能按预期工作。在这种情况下,9高于42 ......

更新

您刚刚添加了code列的数据类型为varchar ...如果您期望对数字进行比较,那么带有qoutes >'42'的代码就会非常危险错了!