[T-SQL] 使用sp_executesql 執行SQL語句。

  • 4570
  • 0
  • SQL
  • 2017-02-15

sp_executesql 

前幾天因為系統程式需要執行SQL語句,所以當下就寫了一支預存程序,準備要用exec,去做執行。(之前這麼幹,也沒覺得甚麼不對)

接著,就見到幾篇說明利用EXEC執行SQL語法,可能會遇到SQL Injection的文章,雖然呼叫的C# 程式已經使用參數帶入資料。

但是既然有風險,為什麼不改善它,所以就重新參閱了一些文章,改用Sp_executsql 來執行語句。

以下是範例:......只是使用範例....

--建立變數資料表
DECLARE @TB TABLE 
(
PSN int,
PNAME nvarchar(11),
PDATE varchar(8)
)
--利用while塞資料
DECLARE @i int 
SET @i = 1
DECLARE @PNAME nvarchar(15),@PDATE varchar(8),@NU varchar(2)

	WHILE @i <=15
		BEGIN
			SET @PDATE = CONVERT(varchar(8), GETDATE(),112)
			SET @NU = RIGHT(REPLICATE('0', 2) + CAST(@i as VARCHAR),2)
			SET @PNAME = 'P'+@PDATE + @NU
			INSERT INTO @TB 
			VALUES ( @i , @PNAME , @PDATE)
			SET @i = @i + 1 
		END
--SELECT * FROM  @TB

--寫入暫存資料表(其實一開始直接存入暫存就好.....但是只是範例,就不改了,使用較快的方式呈現結果)
SELECT * INTO #TB FROM @TB 

--DECLARE @PSN varchar(10)
DECLARE @PDATE1 varchar(8)
DECLARE @PNAME1 nvarchar(15)
--設定傳入字串的查詢條件
--SET @PSN = '1,3,5'
SET @PDATE1 = '20170214'
SET @PNAME1 = 'P2017021412'

DECLARE @EXSTR NVARCHAR(MAX)
DECLARE @PARAMS NVARCHAR(50)
BEGIN
	SET @EXSTR = N'SELECT * FROM #TB WHERE PNAME = @PNAME AND PDATE = @PDATE ; '
END

--指定變數的參數資料
SET @PARAMS = N'@PNAME NVARCHAR(15),@PDATE NVARCHAR(8)';
--執行時1.語句 2.參數內容 3.參數對應的資料
EXEC dbo.sp_executesql @EXSTR, @PARAMS, @PNAME=@PNAME1 ,@PDATE = @PDATE1

--刪除暫存
DROP TABLE #TB


實際操作起來,確實也看到了一些問題,例如如果遇到SQL語句要用IN 查詢.....該怎麼處理?

之前使用EXEC的作法,是利用Function 將字串 轉成Table做查詢。目前尚沒有時間測試.....(下次再說吧!!...偷懶ing....)

 

參考資料來源:

MSDN

Hunterpo's IT Vision 動態 SQL 威力展示 (1) - 基本概念

RiCo技術農場 [SQL SERVER]使用 sp_executesql 取代 exec

 

 

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。