我将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
答案 0 :(得分:1)
SQL Server能够隐式地转换某些类型Find details here
这取决于列Code
的数据类型。它是数字的(例如INT
),引擎会隐式地将42
强制转换为数字。如果没有,比较将在字符串级别完成。
你必须意识到,字母数字比较 - 可能 - 不能按预期工作。在这种情况下,9
高于42
......
您刚刚添加了code
列的数据类型为varchar ...如果您期望对数字进行比较,那么带有qoutes >'42'
的代码就会非常危险错了!