Azure SQL 数据库表变量排序规则

问题描述 投票:0回答:2

Azure SQL Server 具有 SQL_Latin1_General_CP1_CI_AS 的固定排序规则。我有一个 Azure SQL 数据库,其排序规则为 Latin1_General_CI_AS。创建表变量并加入数据库表时,我似乎遇到排序规则冲突错误。这是代码:

DECLARE @resultingRoles TABLE ([MemberRoleName] NVARCHAR(256) NOT NULL PRIMARY KEY)

INSERT INTO @resultingRoles
SELECT DISTINCT([MemberRoleName]) FROM [RolesInRoles]
    WHERE
[ApplicationName] = @applicationName AND
[MemberRoleName]  IN (@role0,@role1,@role2)
WHILE (@@ROWCOUNT>0)
    BEGIN   
    INSERT INTO @resultingRoles
    SELECT DISTINCT([roles].[TargetRoleName])
    FROM [RolesInRoles] AS [roles] 
    INNER JOIN @resultingRoles sj ON sj.[MemberRoleName] = [roles].[MemberRoleName] 
    LEFT JOIN @resultingRoles lf on [roles].[TargetRoleName] = lf.[MemberRoleName]
    WHERE lf.[MemberRoleName] IS NULL
    AND [roles].[ApplicationName] = @applicationName
END

这会导致以下错误:

无法解决等于操作中“Latin1_General_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。

我认为这是因为 tabel 变量列 MemberRoleName 是使用 SQL Server 排序规则而不是数据库排序规则创建的。我的期望是使用数据库排序规则 - 我错了吗?

有什么方法可以检查表变量的排序规则吗?

编辑:我无法更改此 SQL 代码来显式设置排序规则。

sql-server azure azure-sql-database
2个回答
1
投票

尝试使用

 DECLARE @resultingRoles TABLE ([MemberRoleName] NVARCHAR(256) COLLATE Latin1_General_CI_AS NOT NULL PRIMARY KEY)

0
投票

您可以运行以下查询来获取您需要的信息:

--List the collation supported
SELECT * FROM sys.fn_helpcollations();

--Get server collation    
SELECT SERVERPROPERTY('Collation') AS Collation;  

--Get databse collation
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS Collation;

--Get Table columns collation
SELECT name, collation_name FROM sys.columns
WHERE    object_id = OBJECT_ID('TableName', 'U')
AND name <> 'id'

--Update Table Column collation
ALTER TABLE TableName ALTER COLUMN ColumnName [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AI
© www.soinside.com 2019 - 2024. All rights reserved.