【问题标题】:Azure SQL database table variable collationAzure SQL 数据库表变量排序规则
【发布时间】:2018-06-18 12:48:19
【问题描述】:

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

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”之间的排序规则冲突。

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

有没有办法检查表变量的排序规则?

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

【问题讨论】:

    标签: sql-server azure azure-sql-database


    【解决方案1】:

    尝试使用

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

    【讨论】:

    • 这不是我的应用程序代码 - 我无法对其进行更改
    • 不确定您要什么。该表没有排序规则..它将是表中的文本/字符列。表变量和临时表也是在 tempdb 中创建的,所以会使用服务器排序规则
    • 你可能想看看这个:azure.microsoft.com/en-gb/blog/…
    • 我在问表变量是否应该使用服务器或数据库排序规则。
    • 我提到的表变量将使用服务器排序规则,但是我认为变量将在数据库排序规则中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2014-02-22
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2016-11-17
    相关资源
    最近更新 更多