如何在sql server中整理sysname

时间:2015-06-09 16:30:53

标签: sql-server sql-server-2008-r2

我正在尝试运行查询以丢弃来自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时查询运行 我的三个部分问题是:我是因为一行还是因为列数据类型是sysname而得到问题? COLLATE Latin1_General_CI_AI是否适用于此方案的正确语法? 当我运行此查询时

SELECT name, description
FROM sys.fn_helpcollations()

结果显示了不同语言的许多归类。那么我怎么得到一个完整的英文数据库的这个错误。

修改 我运行了这两个查询来检查数据库和服务器的collat​​ion属性

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

,两者的结果都是

SQL_Latin1_General_CP1_CI_AS

3 个答案:

答案 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));