Sql-Server
這個語句是什麼意思:SELECT … COLLATE SQL_Latin1_General_CP1_CI_AS AS− −Log我是T_oB和C重新開始____−−−−大號這G一世ns噸這乙和Cr和一種噸和d−−-- Logins…
這個聲明是什麼意思?
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}