Sql server T-SQL确定性INT-Cast

Sql server T-SQL确定性INT-Cast,sql-server,tsql,casting,int,deterministic,Sql Server,Tsql,Casting,Int,Deterministic,鉴于: SQL Server 名为TEST_Table的表 TEST_表中名为TEST_字段、类型为VARCHAR50的列不为NULL 第1行:10年3/6 第2行:10年3/2 查询:从测试表中选择测试字段,其中。。。 问题: 在where条件下,我需要测试字符串最后一个字符中的值。在Where子句中,我注意到同样的行为 右测试_字段,1>3 CASTRIGHTTEST_字段,1为INT>3 在案例1中,通过一些推断的强制转换,它们的行为是否相同?案例1是确定性的吗 提前谢谢 Matt当您检查

鉴于:

SQL Server 名为TEST_Table的表 TEST_表中名为TEST_字段、类型为VARCHAR50的列不为NULL 第1行:10年3/6 第2行:10年3/2 查询:从测试表中选择测试字段,其中。。。 问题:

在where条件下,我需要测试字符串最后一个字符中的值。在Where子句中,我注意到同样的行为

右测试_字段,1>3 CASTRIGHTTEST_字段,1为INT>3 在案例1中,通过一些推断的强制转换,它们的行为是否相同?案例1是确定性的吗

提前谢谢


Matt

当您检查值时,会进行转换,例如:

DECLARE @t varchar(100)

SET @t = (SELECT 'ABCA2')

SELECT @t    

IF RIGHT(@t, 2) > 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'
DECLARE @t varchar(100)

SET @t = (SELECT '1')

SELECT @t

IF @t < 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'
将引发错误,因为SQL无法在不引发错误的情况下将A2转换为整数

但是,如果将@t替换为:

设置@t=选择“ABC12”

当转换成功并且可以进行比较时,上述代码将起作用。正确的函数本身不会转换您的值。MSDN明确说明了权限的返回类型:

当字符\表达式为非Unicode字符时返回varchar 数据类型

当字符\表达式是Unicode字符数据时返回nvarchar 类型

为了让自己更轻松,在与文本进行比较时,请完全取消该功能,例如:

DECLARE @t varchar(100)

SET @t = (SELECT 'ABCA2')

SELECT @t    

IF RIGHT(@t, 2) > 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'
DECLARE @t varchar(100)

SET @t = (SELECT '1')

SELECT @t

IF @t < 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'

请注意,我没有打电话到右边。上面的结果是显示1,然后显示文本Hi。

是的情况1是确定的-要么成功地将字符串隐式转换为整数,然后比较两个整数,要么抛出异常。

因此在我的情况下,值本身有几个唯一的值。10年3/6。10、3和6。不使用正确的方法会把它们混在一起,不是吗?1036? 或者更糟的是10而不是3或6?我不确定这个行为,所以我的问题在心里继续。@MattAkers-如果你能分别解析这些值得到10、3和6,那么你就可以了。如果不能,则文本与整数数据类型的比较将引发异常。您无法将10YR3/6与值(例如100)进行比较。它不知道如何执行该操作,这与右侧甚至左侧无关,更重要的是在比较完成时进行转换。这有意义吗?这很有意义。我完全同意你的例子和评论。关于比较转换何时何地通过/失败,我的问题是:为什么第1条和第2条执行相同,如果第1条似乎在黑盒中进行转换,我真的需要直接转换吗?where子句1是否具有确定性行为?如果1似乎在黑匣子中进行了转换,我真的需要直接进行转换吗?不,你不必投。where子句1是否具有确定性行为?是的,汉克斯·巴科。这就是我要找的。干杯