Sql-Server

使用 oneliner sql 語句創建包含換行符的儲存過程

  • November 22, 2018

我想將程式碼放在一行中,該行將創建一個包含換行符的儲存過程。

  • 那可能嗎?
  • 我需要使用 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);
*/

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