星期五, 5月 15, 2015

[SQL] sp_executesql 參數限制

在 Store Procedure 中,利用 sp_executesql 執行動態 TSQL 語法時,出現下面的錯誤訊息
程序必須有類型 'ntext/nchar/nvarchar' 的參數 '@statement'。
閱讀 MSDN 上發現,原來 sp_executesql 的第一、二個參數都必須是 Unicode
  • @stmt:Transact-SQL 陳述式或批次的 Unicode 字串。@stmt 必須是 Unicode 常數或 Unicode 變數。
  • @params:包含 @stmt 的所有內嵌參數定義的字串。 此字串必須是 Unicode 常數或 Unicode 變數。
USE [AdventureWorks2014]
GO

CREATE PROCEDURE [dbo].[uspQtyStat] 
(
    @StartDate date, 
    @EndDate date, 
    @ProdNO char(5) = '', 
    @Status nchar(4) = ''
)
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @TSQL varchar(max) -- 問題所在,不是 Unicode
 
    SET @TSQL = 
        'SELECT 
             ProdName , 
             ProdNO , 
             Status , 
             Area ,
             COUNT(*) AS Qty
         FROM GVPractice
         WHERE CreateDate BETWEEN @StartDate AND @EndDate'
 
    IF @ProdNO <> ''
        SET @TSQL += 
            '
            AND ProdNO = @ProdNO'

    IF @Status <> ''
        SET @TSQL +=
            '
            AND Status = @Status'
 
    SET @TSQL += 
        '
        GROUP BY ProdName , ProdNO , Status , Area'

    EXEC dbo.sp_executesql 
        @TSQL,
        N'@StartDate date, @EndDate date, @ProdNO char(5), @Status nchar(4)',
        @StartDate ,
        @EndDate ,
        @ProdNO ,
        @Status

END
GO

把 @TSQL 宣告為 nvarchar(max) 就可以執行

沒有留言:

張貼留言