我正在尝试运行查询以删除来自 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
时查询运行
我的三部分问题是:我是因为一行还是因为列数据类型是 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')
关于sql-server - 如何整理sql server中的sysname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30737833/