【问题标题】:String Value is not recognized by select statement passing identical string value传递相同字符串值的选择语句无法识别字符串值
【发布时间】:2020-05-09 07:06:06
【问题描述】:

我正在努力使用下面的查询来提取数据。

该列中的所有字符串值都会出现此问题。即使我从该表中复制 SSMS 中的实际值并将其粘贴到 select 语句 (where string = 'MyStringVlaue') 中。 LTRIM/RTRIM 函数也没有帮助。

一些信息:

数据库表源列数据类型为VARCHAR(500)

我的数据库兼容级别是 130。使用 SSMS 2016。 我的数据库排序规则是 SQL_Latin1_General_CP1_CI_AS 我的字符串列排序规则是 SQL_Latin1_General_CP1_CI_AS

但是,当查询从有问题的源表复制到其他表中的相同字符串值时,它不会产生任何问题。

有问题的表是使用 SQL Server 导入向导从向导识别为 2007-2010 类型的 Excel 文件导入的。

drop table #T
select 'MyStringVlaue' as String into #t
select * from #t where String ='MyStringVlaue' -- this does not return anything when executed on the Real table!
select * from #t 

--例子

select ASCII('MEDICAL SERVICES DISTRICT') -- output is 65

--附言

我通过运行select * into from originalSourceTable 创建了有问题的表的副本 还是有同样的问题。

【问题讨论】:

  • 所以给我们一个实际字符串不起作用的例子。并给我们列的排序规则。并在字符串中的每个字符上使用ASCII 函数来查看它们是否是funny 的。
  • 嗨@DaleK,我刚刚用请求的信息更新了问题。
  • ASCII 一次只能处理一个字符,所以很痛苦,但是你必须对每个字符进行子串化(目前你只能得到第一个字符的结果)。那就是说你的字符串看起来很正常。
  • 您没有在字符串末尾存储 CR 和/或 LF 字符,是吗?这不会复制和粘贴,因此可能会导致您看到的内容。

标签: sql-server string replace unicode sqldatatypes


【解决方案1】:

暂定解决方案: 这可能是 SSMS 本身的一个错误。一旦我打开一个新的查询编辑器窗口并手动输入相同的选择语句,问题就消失了。尽管请注意,我从旧的 SSMS 查询编辑器窗口复制并粘贴了代码,但问题仍然存在。只有当我从头开始手动输入代码时它才有帮助。

【讨论】:

  • 不太可能是错误,更可能是损坏的字符串。
【解决方案2】:

您的数据库值中可能存在“不可见”字符,通常的罪魁祸首是尾随换行符,但它可能是任何东西,例如制表符、垂直制表符、退格符等。

像这样输出不匹配值的十六进制值:

SELECT
    CAST(myStringColumn AS VARBINARY(4)),
    CAST('MEDICAL SERVICES DISTRICT' AS VARBINARY(4))
FROM mytable
WHERE myStringColumn like '%MEDICAL SERVICES DISTRICT%'
AND myStringColumn <> 'MEDICAL SERVICES DISTRICT' 

你可能会通过检查找出问题。

如果您有 unicode 字符串,请使用 VARBINARY(8) 而不是 VARBINARY(4)

【讨论】:

    【解决方案3】:

    首先一个字符串值没有排序规则。演示:

    DECLARE @STRING VARCHAR(32) COLLATE French_CI_AI;
    

    会失败。

    其次,当您创建临时表 (#) 时,排序规则是 tempdb 排序规则。并且这种排序规则可以与上下文数据库排序规则不同。

    第三,存在很多解决方案:

    1) 与默认上下文数据库进行整理:

    select 'MyStringVlaue' COLLATE database_default as String into #t
    

    2) 与特定的对照:

    select 'MyStringVlaue' COLLATE SQL_Latin1_General_CP1_CI_AS as String into #t
    

    3) 使用默认上下文数据库自动整理:

    如果数据库被部分包含……

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 2014-12-02
      • 2021-11-12
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多