MrM*_*att 1 sql-server sql-except
我正在审核两个相同结构表中的值。T-SQLEXCEPT语句忽略一个表中某个值的尾随空格,因此这些值不匹配,但也不会出现在我们的审计中。
我尝试寻找改变 SQL 比较列的方式的方法。我做了类似的事情来确保它区分大小写,但找不到可以使其在字段值中包含空格/填充的东西。
示例数据的值为MyTable“产品名称”,而 的RemoteTable值为“产品名称”。
为了快速重现,这是我现在正在做的事情的精简版本:
DECLARE @SampleLocal TABLE(ProductName varchar(50))
DECLARE @RemoteTable TABLE(ProductName varchar(50))
INSERT INTO @SampleLocal (ProductName) VALUES ('Product Name')
INSERT INTO @RemoteTable (ProductName) VALUES ('Product Name ')
SELECT ProductName COLLATE SQL_Latin1_General_CP1_CS_AS ProductName
FROM @SampleLocal
EXCEPT
SELECT ProductName COLLATE SQL_Latin1_General_CP1_CS_AS ProductName
FROM @RemoteTable
Run Code Online (Sandbox Code Playgroud)
当前没有返回结果,表明值是相同的。但第二个表中的值末尾有一个空格。
我希望得到一个包含“产品名称”的结果
当我需要比较区分大小写的事物时,我可以添加
COLLATE SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)
是否有类似的东西会因为空格而显示不同的值?
小智 5
ANSI 标准要求对比较中使用的字符串进行填充,以便在比较之前它们的长度匹配。填充直接影响 WHERE 和 HAVING 子句谓词以及其他 Transact-SQL 字符串比较的语义。例如,对于大多数比较操作,Transact-SQL 认为字符串 'abc' 和 'abc ' 是等效的。
这种行为是有意为之的。
您可以使用较慢的方法来实现您想要的:
SELECT innerItems.ProductName
FROM
(
SELECT DATALENGTH(ProductName) as realLength, ProductName COLLATE SQL_Latin1_General_CP1_CS_AS as ProductName
FROM @SampleLocal
EXCEPT
SELECT DATALENGTH(ProductName) as realLength, ProductName COLLATE SQL_Latin1_General_CP1_CS_AS as ProductName
FROM @RemoteTable
) innerItems
Run Code Online (Sandbox Code Playgroud)
将这些值和实际长度进行比较就发挥了神奇的作用。(len在这种情况下,该方法会给出“错误”结果)