这个声明是什么意思?
SELECT ... COLLATE SQL_Latin1_General_CP1_CI_AS AS [-- Logins To Be Created --]
它是我正在尝试调整的脚本的一部分,以列出要迁移到另一个实例的实例中的 SQL Server 登录名。这是整个代码:
SELECT 'IF (SUSER_ID('+QUOTENAME(SP.name,'''')+') IS NULL) BEGIN CREATE LOGIN ' +QUOTENAME(SP.name)+
CASE
WHEN SP.type_desc = 'SQL_LOGIN' THEN ' WITH PASSWORD = ' +CONVERT(NVARCHAR(MAX),SL.password_hash,1)+ ' HASHED, CHECK_EXPIRATION = '
+ CASE WHEN SL.is_expiration_checked = 1 THEN 'ON' ELSE 'OFF' END +', CHECK_POLICY = ' +CASE WHEN SL.is_policy_checked = 1 THEN 'ON,' ELSE 'OFF,' END
ELSE ' FROM WINDOWS WITH'
END
+' DEFAULT_DATABASE=[' +SP.default_database_name+ '], DEFAULT_LANGUAGE=[' +SP.default_language_name+ '] END;' COLLATE SQL_Latin1_General_CP1_CI_AS AS [-- Logins To Be Created --]
FROM sys.server_principals AS SP
LEFT JOIN sys.sql_logins AS SL ON SP.principal_id = SL.principal_id
WHERE SP.type IN ('S','G','U')
AND SP.name NOT LIKE '##%##'
AND SP.name NOT LIKE 'NT AUTHORITY%'
AND SP.name NOT LIKE 'NT SERVICE%'
AND SP.name <> ('sa')
AND SP.name <> 'distributor_admin'
这
AS [-- Logins To Be Created --]
只是结果集的列别名,因为选择的是表达式,而不是列。默认情况下,表达式没有列名,因此这是一种标记结果集列的方式,以便更清晰地输出。如果您执行该查询,您将看到结果集中的单个列被标记为:
-- Logins To Be Created --
。这与排序无关。这
COLLATE SQL_Latin1_General_CP1_CI_AS
是潜在的无关和不必要的。如果我删除它(从问题中发布的查询中),查询的工作原理是一样的。但是,在某些情况下(对于其他查询,不是这个),如果有多个列而不是所有列,COLLATE
则需要一个子句/关键字来显式强制所有要连接的列(这发生在这个特定的表达式中)的通用排序规则在连接(或一般的表达式)中使用的排序规则完全相同。在这种情况下,如果没有then 查询将得到排序规则冲突错误。COLLATE {any_collation_should_work}