SQL Server解惑——為什么你拼接的SQL語句換行符失效?
本文轉(zhuǎn)載自微信公眾號「DBA閑思雜想錄」,作者瀟湘隱者 。轉(zhuǎn)載本文請聯(lián)系DBA閑思雜想錄公眾號。
在SQL Server數(shù)據(jù)庫的維護(hù)管理當(dāng)中,我們經(jīng)常要用SQL語句生成一些維護(hù)操作的SQL語句,例如,我們要批量的修改數(shù)據(jù)庫的恢復(fù)模式。如下所示:
- --===========================================================================================================================
- -- ScriptName : change_recovery_model_to_full.sql
- -- Author : Kerry
- -- CreateDate : 2015-12-18
- -- Description : 將用戶數(shù)據(jù)庫的恢復(fù)模式從簡單模式切換為完整模式。
- /******************************************************************************************************************
- Parameters : 參數(shù)說明
- ********************************************************************************************************************
- ********************************************************************************************************************
- Modified Date Modified User Version Modified Reason
- ********************************************************************************************************************
- 2015-12-18 Kerry V01.00.00 新建該腳本。
- *******************************************************************************************************************
- 注意事項(xiàng) :
- SP_EXECUTESQL 執(zhí)行的腳本里面不能使用GO語句;如果需要執(zhí)行的話,上面字符串必須去掉GO。
- *******************************************************************************************************************/
- --===========================================================================================================================
- DECLARE @SQL_TEXT NVARCHAR(MAX) ='';
- SELECT @SQL_TEXT +=
- 'USE master;' + CHAR(10)
- + 'GO' +CHAR(10)
- + 'ALTER DATABASE ' + QUOTENAME(name) + ' SET RECOVERY FULL WITH NO_WAIT;' + CHAR(10)
- + 'GO' +CHAR(10)
- FROM sys.databases WITH(NOLOCK)
- WHERE recovery_model_desc='SIMPLE'
- AND state=0 --0表示ONLINE
- AND name NOT IN ('master', 'msdb', 'model','tempdb', 'distribution','ReportServer','ReportServerTempDB')
- ORDER BY database_id;
- PRINT @SQL_TEXT;
我們?yōu)榱松奢敵龅腟QL腳本的格式更漂亮/美觀一點(diǎn),不至于擠到一行或一團(tuán),可能經(jīng)常在拼接時要使用換行符之類的特殊字符,如上所示,我們在拼接SQL語句的時候,我們會使用CHAR(10),有時候也會使用CHAR(9)、CHAR(10)、CHAR(13)這些特殊函數(shù)。
- CHAR(9) \t 水平制表符
- CHAR(10) \r 回車
- CHAR(13) \n 換行
但是在一些環(huán)境下面,你會發(fā)現(xiàn)類似上面SQL可能會“工作”地很正常,但是在一些環(huán)境下面,你將拼接生成的SQL拷貝到SSMS的會話窗口或文本文件時,你會發(fā)現(xiàn)回車或換行符都失效了,這到底是怎么一回事呢?
其實(shí)這個還真跟SSM的環(huán)境設(shè)置有關(guān),如果你從網(wǎng)格拷貝的時候,換行符或回車符失效了,那么你應(yīng)該在SSMS的菜單中選項(xiàng):“選項(xiàng)”-> “查詢結(jié)果”-> “SQL Server”-> “以網(wǎng)格顯示結(jié)果”中,勾選“復(fù)制或保存時保留CR/LF(E)”選項(xiàng),如果SSMS是英文環(huán)境的話,那么對應(yīng)的選項(xiàng)為“Retain CR/LF on copy or save”
另外,當(dāng)你導(dǎo)出查詢結(jié)果時,如果你不想因?yàn)檫@些換行符或回車符導(dǎo)致CSV或Excel格式混亂的話,你也可以取消這個選項(xiàng)。其實(shí)這個是一個很簡單的事情,但是確實(shí)有一些同學(xué)對這些完全不了解。所以在這里簡單的介紹一下。