gpt4 book ai didi

sql - 如何防止 SQL 语法中排序规则影响表名?

转载 作者:行者123 更新时间:2023-12-03 00:29:39 25 4
gpt4 key购买 nike

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

(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,因此任何数据库,默认都有此排序规则(并且我们在创建数据库时没有专门设置数据库的排序规则)通过代码/脚本创建新数据库)。在这种情况下,我仍然没有想到我们的表名会被完全不同地解释。这意味着我们唯一的选择是在数据库上强制使用拉丁排序规则,并且如果用户想要不同的东西,他们可以指定每列排序规则?

最佳答案

我认为 SQL Server 在执行查询之前,检查或编译它,例如它检查表验证,如下所示:

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

那不会有任何结果。而对于其他将返回结果的模式。
因此,它会引发:

Invalid object name 'Dataarchive'.

但是您可以使用另一个 COLLATION 检查 sys.object,如下所示:

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 - 如何防止 SQL 语法中排序规则影响表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47292477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com