编写一个过滤包含NCHAR的记录的T-SQL查询(2028)

时间:2010-02-02 19:45:05

标签: sql sql-server sql-server-2005 tsql

我的最终目标是编写一个sql脚本,用于从特定表中选择数据,其中nvarchar(max)列包含字符NCHAR(2028)。

但显而易见:

select * 
from tablename
where columnname like '%' + NCHAR(2028) + '%'

返回所有行。

3 个答案:

答案 0 :(得分:4)

使用二进制排序规则进行比较。

select * 
from tablename
where columnname COLLATE Latin1_General_Bin like '%' + NCHAR(2028) + '%'

答案 1 :(得分:2)

这有效

CREATE TABLE #temp (columnname NVARCHAR(128))

INSERT #temp VALUES ('a')
INSERT #temp VALUES ( NCHAR(2028))
INSERT #temp VALUES ('b')
INSERT #temp VALUES ('c' +  NCHAR(2028) + 'c')
 INSERT #temp VALUES ('a' + NCHAR(2028) + 'b') 





 SELECT  *
FROM #temp
WHERE ColumnName COLLATE Latin1_General_Bin Like N'%' + NCHAR(2028) + '%'

drop table  #temp

答案 2 :(得分:1)

我认为你的排名不受限制。我有一些奇怪的行为。注意这里两个SELECT的结果:

CREATE TABLE dbo.foo
(
    id INT IDENTITY(1,1),
    bar NVARCHAR(128)
);

INSERT dbo.foo(bar) SELECT N'foobar'
UNION 
SELECT N'foo' + NCHAR(2028) + N'bar'

SELECT *
    FROM dbo.foo
    WHERE bar LIKE N'%' + NCHAR(2028) + '%';

TRUNCATE TABLE dbo.foo;

INSERT dbo.foo(bar)
SELECT N'foo' + NCHAR(2028) + N'bar'

SELECT *
    FROM dbo.foo
    WHERE bar LIKE N'%' + NCHAR(2028) + '%';

DROP TABLE dbo.foo;

请注意,无论我们是插入了一行还是两行,我们总是返回第一行,即使查询相同且数据已更改。

不幸的是,将NCHAR(2028)的实际值粘贴到SSMS中是行不通的,因为它不在支持的字符集中(我在Super Mario Brothers中得到像问号框一样的字形)。否则我只是建议:

WHERE columnname LIKE N'%߬%';

如果你可以从代码中做到这一点(而不用担心SSMS),那么它可能是一个可行的选择。