簡體   English   中英

如何在SQL Server中整理sysname

[英]How to collate sysname in sql server

我試圖運行查詢以刪除來自Windows的服務器登錄並重新創建它們。 我運行此查詢以刪除登錄名,並且工作正常

USE master
SELECT 
       'IF EXISTS (SELECT * FROM sys.server_principals WHERE name = ' + 
       '''' + [name] + '''' + ')' +
       ' BEGIN DROP LOGIN ' + QUOTENAME([name]) + ' END; ' + 
       'CREATE LOGIN ' + QUOTENAME([name]) + ' FROM WINDOWS; '
FROM sys.server_principals  
WHERE type_desc IN ('WINDOWS_GROUP' , 'WINDOWS_LOGIN')

但是下面的查詢

USE master
SELECT 
       'ALTER LOGIN ' + QUOTENAME([name]) + ' WITH DEFAULT_DATABASE = ' + 
        spr.default_database_name
       + 'GRANT ' + spe.permission_name  + ' to ' + QUOTENAME([name])
       + CASE WHEN spr.default_database_name IS NOT NULL
            THEN ' WITH DEFAULT DATABASE = ' + spr.default_database_name
            ELSE 
            ''
        END
FROM sys.server_principals spr INNER JOIN 
     sys.server_permissions spe  ON spr.principal_id = spe.grantee_principal_id
WHERE spr.type_desc IN ('WINDOWS_GROUP', 'WINDOWS_LOGIN')

返回此錯誤

Cannot resolve collation conflict for column 1 in SELECT statement.

因此,當我調查此問題時,它來自sysnamedefault_database_name我使用spr.default_database_name COLLATE Latin1_General_CI_AI時查詢運行了spr.default_database_name COLLATE Latin1_General_CI_AI我的三個部分的問題是:是由於行還是因為列數據類型為sysname而導致出現此問題? COLLATE Latin1_General_CI_AI是此方案的正確語法嗎? 當我運行此查詢

SELECT name, description
FROM sys.fn_helpcollations()

結果顯示了針對不同語言的許多排序規則。 那么,對於一個完整的英語數據庫,我如何得到此錯誤。

編輯:我運行了這兩個查詢來檢查數據庫和服務器的排序規則屬性

SELECT DATABASEPROPERTYEX(N'master', N'Collation')
SELECT SERVERPROPERTY(N'Collation')

他們兩個的結果是

SQL_Latin1_General_CP1_CI_AS

這可能有助於為數據庫和服務器實例帶來默認的整理,更改查詢,如下所示:

SELECT 
       'ALTER LOGIN ' + QUOTENAME([name]) + ' WITH DEFAULT_DATABASE = ' + 
        spr.default_database_name COLLATE database_default
       + 'GRANT ' + spe.permission_name  + ' to ' + QUOTENAME([name])
       + CASE WHEN spr.default_database_name IS NOT NULL
            THEN ' WITH DEFAULT DATABASE = ' + spr.default_database_name COLLATE database_default
            ELSE 
            ''
        END
FROM sys.server_principals spr INNER JOIN 
     sys.server_permissions spe  ON spr.principal_id = spe.grantee_principal_id
WHERE spr.type_desc IN ('WINDOWS_GROUP', 'WINDOWS_LOGIN')

好像MS上的某人已將sys.server_permissions.state_desc上的排序規則固定為Latin1_General_CI_AS_KS_WS

我嘗試了許多實例(SQL 2016),發現了相同的問題。 放置“ collat​​e database_default”有效。

您問題的解決方案:為CONCAT指定兩列的排序規則

USE master
GO
SELECT 
   'ALTER LOGIN ' + QUOTENAME([name]) COLLATE SQL_Latin1_General_CP1_CI_AS + 
' WITH DEFAULT_DATABASE = ' + 
    spr.default_database_name COLLATE SQL_Latin1_General_CP1_CI_AS
   + 'GRANT ' + spe.permission_name  + ' to ' + QUOTENAME([name])
   + CASE WHEN spr.default_database_name IS NOT NULL
        THEN ' WITH DEFAULT DATABASE = ' + spr.default_database_name
        ELSE 
        ''
    END
FROM sys.server_principals spr INNER JOIN 
 sys.server_permissions spe  ON spr.principal_id = spe.grantee_principal_id
WHERE spr.type_desc IN ('WINDOWS_GROUP', 'WINDOWS_LOGIN')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM