sql-server - 如何整理sql server中的sysname

标签 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()

结果显示了不同语言的许多排序规则。那么对于一个完全英文的数据库,我是如何得到这个错误的。

编辑: 我运行了这两个查询来检查数据库和服务器的排序规则属性

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/

相关文章:

sql - sql中如何连接两个不相关的表

sql - 在 SQL Server 中如何合并相似的字符串以用于计数目的

sql - GRANT EXECUTE 存储过程是否授予您访问其中所有对象的权限?

sql-server - 用于传输没有默认架构的表的 SMO 传输类

sql - 错误 - 指定的数据类型无效。 [数据类型(如果已知)= varchar]

SQL Server - 在带有文本和数字的 varchar 字段中的两个数字范围之间进行选择

sql - 在数据库的未知表中查找特定列条目?

sql-server - 错误服务代理服务

mysql - 添加查询中不存在的列

sql - 动态 View 管理查询