当我尝试连接不同类型的两列时,我收到以下警告:
表达式 (CONVERT_IMPLICIT(varchar(41), [TABLE].[COLUMN], 0)) 中的类型转换可能会影响选择查询计划时的“CardinalityEstimate”。
通过搜索...我似乎已经明白这个警告可以从不同类型的两列的比较中得出。为此我想进行一些简单的测试来加深这个事情:
CREATE TABLE TABLE_A (
ID DECIMAL(5, 0) NOT NULL,
COLUMN_A VARCHAR(255) NULL
)
INSERT TABLE_A (ID, COLUMN_A) VALUES (1, 'TEST_1')
INSERT TABLE_A (ID, COLUMN_A) VALUES (2, 'TEST_2')
INSERT TABLE_A (ID, COLUMN_A) VALUES (3, 'TEST_3')
Run Code Online (Sandbox Code Playgroud)
尝试使用运算符连接不同类型的两列,会返回错误:“将数据类型从 varchar 转换为数字时出错。”
SELECT ID + COLUMN_A
FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
如果我尝试做同样的事情但转换“ID”列,我不再有错误,但我收到前面提到的警告。
SELECT CAST(ID AS VARCHAR(255)) + COLUMN_A
FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用concat()函数连接,我会得到相同的结果,没有错误,但有警告。
SELECT CONCAT(ID, COLUMN_A)
FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
我的问题是,即使在我投射时它们应该相等,我怎么可能收到关于比较两列的警告?如何连接不同类型的两列而不返回该警告?
提前致谢,贾科莫。
Pau*_*ite 14
“警告”纯粹是提供信息的。编译过程会自动生成它们,您无法关闭它们。即使它们没有用,它也会产生它们。
如果您的查询执行缓慢,或者您注意到执行计划中的基数估计不正确,则“警告”将为您提供有关在何处查找可能原因的信息。
如果您没有这些顾虑,您可以安全地忽略“警告”。
只是因为我知道有人会从字面上回答你的问题,是的,可以在没有警告的情况下连接,但没有必要。这是较慢的方法之一,但确实避免了警告:
-- Don't use this
SELECT FORMAT(TA.ID, 'N0') + TA.COLUMN_A
FROM dbo.TABLE_A AS TA;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
968 次 |
最近记录: |