Sql-Server
使用 oneliner sql 語句創建包含換行符的儲存過程
我想將程式碼放在一行中,該行將創建一個包含換行符的儲存過程。
- 那可能嗎?
- 我需要使用 sp_executesql 嗎?
- 如何在 sql 語句中轉義換行符?
- 如何在字元串中轉義換行符?
是的,您可以使用動態 SQL 執行以下操作:
DECLARE @SQL NVARCHAR(MAX) = N''; DECLARE @NewLine NCHAR(1) = NCHAR(10); SET @SQL = @SQL + N'SELECT * ' + @NewLine + N'FROM sys.databases AS d ' + @NewLine + N'WHERE d.database_id > 4;' + @NewLine; PRINT @SQL; EXEC sys.sp_executesql @SQL;
不,T-SQL 不能轉義換行符、製表符等。它只有一個用於嵌入字元串分隔符的轉義序列:
''
='
。分隔標識符也有一個轉義序列:""
for"
或]]
for]
,取決於哪個用於分隔標識符。如果您想使用轉義序列,您可以通過該
REPLACE
函式手動執行此操作。根據“單行程式碼”的解釋方式,您可以執行以下任一操作:
IF (OBJECT_ID(N'tempdb..#TestProc') IS NOT NULL) BEGIN DROP PROCEDURE #TestProc; END; GO -- The following is technically a single line (with multiple commands): DECLARE @SQL NVARCHAR(MAX) = N'CREATE PROCEDURE #TestProc\n(\n @Param1 INT,\n @Param2 NVARCHAR(128)\n)\nAS\nSET NOCOUNT ON;\n\nSELECT *\nFROM tempdb.sys.sql_modules\nWHERE [object_id] = OBJECT_ID(N''tempdb..'' + @Param2);'; SET @SQL = REPLACE(@SQL, N'\n', NCHAR(10)); EXEC (@SQL); -- View the definition: PRINT @SQL; -- Test the proc: EXEC #TestProc 2, N'#TestProc';
或者,如果您只能執行單個命令/語句,那麼您可以嘗試以下操作:
IF (OBJECT_ID(N'tempdb..#TestProc2') IS NOT NULL) BEGIN DROP PROCEDURE #TestProc2; END; GO -- The following is a single line and a single statement: EXEC (N'DECLARE @SQL NVARCHAR(MAX) = N''CREATE PROCEDURE #TestProc2\n(\n @Param1 INT,\n @Param2 NVARCHAR(128)\n)\nAS\nSET NOCOUNT ON;\n\nSELECT *\nFROM tempdb.sys.sql_modules\nWHERE [object_id] = OBJECT_ID(N''''tempdb..'''' + @Param2);''; SET @SQL = REPLACE(@SQL, N''\n'', NCHAR(10)); EXEC (@SQL);'); -- Test the proc: EXEC #TestProc2 2, N'#TestProc2'; -- View the definition: DECLARE @SQL2 NVARCHAR(MAX); SELECT @SQL2 = [definition] FROM tempdb.sys.sql_modules WHERE [object_id] = OBJECT_ID(N'tempdb..#TestProc2'); PRINT @SQL2; -- returns (in "Messages" tab): /* CREATE PROCEDURE #TestProc2 ( @Param1 INT, @Param2 NVARCHAR(128) ) AS SET NOCOUNT ON; SELECT * FROM tempdb.sys.sql_modules WHERE [object_id] = OBJECT_ID(N'tempdb..' + @Param2); */