Sql-Server

這個語句是什麼意思:SELECT … COLLATE SQL_Latin1_General_CP1_CI_AS AS−‌ −Log我是T_oB和C重新開始____−−−‌−大號這G一世ns噸這乙和Cr和一種噸和d−−-‌- Logins…

  • July 2, 2021

這個聲明是什麼意思?

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}

引用自:https://dba.stackexchange.com/questions/295119