我正在尝试运行查询以丢弃来自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()
结果显示了不同语言的许多归类。那么我怎么得到一个完整的英文数据库的这个错误。
修改 我运行了这两个查询来检查数据库和服务器的collation属性
SELECT DATABASEPROPERTYEX(N'master', N'Collation')
SELECT SERVERPROPERTY(N'Collation')
,两者的结果都是
SQL_Latin1_General_CP1_CI_AS
答案 0 :(得分:0)
为数据库和服务器实例提供默认排序可能会有所帮助,如下所示更改查询:
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')
答案 1 :(得分:0)
看起来MS的某个人已将sys.server_permissions.state_desc上的排序规则修复为Latin1_General_CI_AS_KS_WS
我已尝试过多个实例(SQL 2016)并发现了同样的问题。放入"整理database_default"的工作原理。
答案 2 :(得分:0)
您的问题的解决方案:为您CONCAT
的两列指定排序规则copy (istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(coll));