![](/img/trans.png)
[英]How can sysname = null in this SQL Server system stored procedure if sysname cannot be null?
[英]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.
因此,當我調查此問題時,它來自sysname
列default_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),發現了相同的問題。 放置“ collate 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.