用户定义的数据类型,我正在查看一些执行计划并看到当 var 声明为用户定义的数据类型类型并从使用该用户定义的数据类型的列中将值拉入该 var 时在后台发生隐式转换,它是将其显示为隐式转换。这是它正常运作的方式吗?
添加
好的,在可编程性->类型->用户定义的数据类型下:有
dbo.BOOL(char(1), not null)
和
ImageAccessibleFLAG TYPE_NAME is BOOL
新测试
我可以通过在数据库中执行以下 reasonforcreatetype is char(1) 来进行隐式转换
declare @test char(1)
set @test = (select top 1 reasonforcreatetype from result)
select @test
<ScalarOperator ScalarString="CONVERT_IMPLICIT(char(1),[Result].[ReasonForCreateType],0)">
现在我用一个 char(1) 和一个 bool 创建一个新表。运行相同的查询,但我没有得到隐式转换。
更新 2
好的,在有问题的同一个表下添加新列时,我得到以下信息
Warning: Columns have different ANSI_PADDING settings.
New columns will be created with ANSI_PADDING 'on'.
我现在假设这与它有关,但我不确定修复或更正这些问题的正确方法。
好的,这是一个重现:
这是前三个查询的相同版本的计划:
第四,缺少计算标量和任何隐式转换:
因此,正如我上面所建议的,这与别名类型没有任何关系,而是在
ANSI_PADDING
很多方面存在问题的事实(这里有一篇及时的文章,一个 Stack Overflow 问题,以及微软自己的 SQL Server 文档2005 告诉你停止使用它)。ANSI_PADDING
我建议的方法是使用这些非列(当然是这次)构建任何表的新版本ANSI_PADDING ON
,迁移数据,删除旧表,并重命名新表。或者只对单独的列执行相同类型的操作(在任何一种情况下,这都将是一件复杂且具有破坏性的事情,您可能希望在维护窗口期间执行此操作)。您可以使用以下方法识别受影响的表:
我会先对一个表或列执行此操作,看看是否值得。看,除了消除隐式转换(您认为这可能会导致性能问题)之外,您还应该证明没有它们,性能实际上会有所不同——并且不同到足以证明付出的努力、风险和潜在的停机时间是合理的。否则,值得吗?我们无法回答这个问题,只有您和您的利益相关者可以。