【问题标题】:How to prevent collation affecting table names in SQL syntax?如何防止排序规则影响 SQL 语法中的表名?
【发布时间】:2018-04-27 19:07:21
【问题描述】:

有人可以解释如何保护表名不受排序规则设置的影响吗? 我目前收到错误消息:

(0 row(s) affected)

(0 row(s) affected)

(0 row(s) affected)
Msg 208, Level 16, State 1, Line 1
Invalid object name 'Dataarchive'.
Msg 208, Level 16, State 1, Line 1
Invalid object name 'MyDatabase.dbo.Dataarchive'.

从此 SQL:

USE master;  
CREATE DATABASE MyDatabase COLLATE Danish_Norwegian_CI_AS;
GO

USE MyDatabase
CREATE TABLE DataArchive (id INT);
GO

SELECT * FROM DataArchive; -- succeeds
SELECT * FROM dataArcHIVE; -- succeeds
SELECT * FROM [MyDatabase].[dbo].[DataArchive]; -- succeeds
GO
SELECT * FROM Dataarchive; -- fails - interprets aa as special A character.
GO
SELECT * FROM [MyDatabase].[dbo].[Dataarchive]; -- fails
GO

USE MASTER;
DROP DATABASE MyDatabase;
GO

我希望排序规则适用于我的数据排序,而不是表名本身。

背景

出现这种情况是因为客户负责安装SQL Server,并将服务器排序规则设置为Danish_Norwegian_CI_AS,所以任何数据库,默认都有这个排序规则(我们在创建数据库的时候并没有专门设置数据库的排序规则)通过代码/脚本创建新数据库)。在这种情况下,我仍然没有想到我们的 表名 会被完全不同的解释。这意味着我们唯一的选择是在数据库上强制进行拉丁排序,如果用户想要不同的东西,他们可以指定每列排序?

【问题讨论】:

  • SELECT * FROM Dataarchvie; 失败,因为你拼错了
  • 谢谢@JuanCarlosOropeza - 我会更新 SQL - 即使拼写正确,它仍然会失败 :-)
  • 您是如何尝试查询的? aa 是丹麦语中的一个二字。影响名称的不是数据库排序规则,您的客户很可能会将其翻译为å。几周前有一个类似的问题,我不敢相信aa 不是aa
  • @PanagiotisKanavos 我只是测试它。如果您删除 COLLATION,所有 5 个查询运行完全相同
  • 如果 collat​​e 是挪威语,则在创建表上使用括号也不能解决问题。我只是测试它:(

标签: sql sql-server tsql collation


【解决方案1】:

我认为 SQL Server 在执行查询之前,检查或编译它,例如它会像这样检查表验证:

select *
from sys.objects
where name = N'Dataarchive'

那将没有结果。而是用于将返回结果的其他模式。
正因为如此,它会引发:

无效的对象名称“Dataarchive”。

但是您可以像这样检查sys.object 和另一个COLLATION

select *
from sys.objects
where name COLLATE latin1_General_CI_AI = N'Dataarchive'

这将产生一个结果,AFAIK,您不能强制 SQL Server DBMS 像这样进行检查或编译。


顺便说一句,在这种情况下,您可以使用动态 SQL 获取表的数据,如下所示:

declare @tablename nvarchar(255) = 'Dataarchive';
declare @sql nvarchar(255) = 
    N'SELECT * FROM '+ (
        select name 
        from sys.tables 
        where name = @tablename COLLATE Latin1_General_CI_AI);
exec sp_sqlexec @sql;

【讨论】:

  • 我有成千上万的数据库语句,这对我来说不是一个好的解决方案。我承认这是一个解决方案,但每个表和列选择都需要经历这个过程,因为我无法预测 SQL Server 可能会为所有可能的数据库排序规则翻译哪两个字符。
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2019-04-29
  • 2016-03-07
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多