显示错误语句的存储过程,其类型为'ntext / nchar / nvarchar'

时间:2018-12-12 03:09:54

标签: sql sql-server stored-procedures

我有此SQL Server存储过程,并且遇到错误

  

程序需要类型为'ntext / nchar / nvarchar'的参数'@statement'

我已经从Oracle转换了此过程,该过程使用了ref Cursor作为我使用过exec的out参数,并且期望得到相同的结果,但是在SQL Server中调用存储过程时遇到错误。

这是我的SQL Server存储过程:

ALTER PROCEDURE [dbo].[GET_CLSFIED_BANK_INFO_BCP] (
    @p_group_by VARCHAR(4000)
    ,@p_bank_id VARCHAR(4000)
    ,@p_addr VARCHAR(4000)
    ,@p_cntry_cd VARCHAR(4000)
    ,@startidx INTEGER
    ,@endidx INTEGER
    ,@rowcnt INTEGER OUTPUT
    ,@p_user_msg nvarchar(4000) OUTPUT) 
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @v_stmt_str VARCHAR(MAX);
    DECLARE @v_proc_name VARCHAR(40) = 'GET_CLSFIED_BANK_INFO_BCP';
    DECLARE @sql_command VARCHAR(4000);

    BEGIN
        SET @v_stmt_str = 'SELECT ROWNUM AS rn, result.* FROM ( '
          +' SELECT /* +ALL ROWS */ ent.i_key,ent.bank_id,attrb.country_cd '
          +' , addr.addr_1,addr.addr_2,addr.addr_3,addr.addr_4,cmstr.category,ent.status'
          +' ,(SELECT COUNT(*) FROM AML_BANK_ROLE brole WHERE brole.i_key=ent.i_key) as ct '
          +' ,ROW_NUMBER() OVER (PARTITION BY clsfier.'+isnull(@p_group_by, '')+' ORDER BY clsfier.'+isnull(@p_group_by, '')+') ptn '
          +' FROM AML_KEY_ENT ent '
          +'     INNER JOIN  MDM_BANK_CLASSIFIER clsfier ON ent.i_key = clsfier.i_key '
          +'     INNER JOIN  AML_BANK_ADDR addr on ent.i_key = addr.i_key '
          +'     INNER JOIN  AML_BANK_ATTRB attrb on ent.i_key = attrb.i_key '
          +'     INNER JOIN  CATEGORY_MASTER cmstr on ent.status = cmstr.status '
          +'  WHERE 1=1 '
          +'   AND ent.status IN (''O'',''C'') ';
          IF (@p_bank_id IS NOT NULL) BEGIN
            SET @v_stmt_str = isnull(@v_stmt_str, '') +' AND ent.bank_id LIKE ''%'+isnull(@p_bank_id, '')+'%'' ';
          END 

          IF (@p_cntry_cd IS NOT NULL) BEGIN
            SET @v_stmt_str = isnull(@v_stmt_str, '') +' AND attrb.country_cd  ='''+isnull(@p_cntry_cd, '')+''' ';
           END 

         IF (@p_addr IS NOT NULL) BEGIN
           SET @v_stmt_str = isnull(@v_stmt_str, '') +' AND (addr.addr_1 || addr.addr_2 || addr.addr_3 || addr.addr_4) LIKE ''%'+isnull(@p_addr, '')+'%'' ';
          END 

         SET @v_stmt_str = isnull(@v_stmt_str, '') +'  )result WHERE result.ptn = 1 ' ;

         SET @sql_command =  'SELECT COUNT(*) FROM ('+isnull(@v_stmt_str, '')+')'
         EXECUTE sp_executesql @sql_command,N'@rowcnt int OUTPUT', @rowcnt =  @rowcnt OUTPUT 
         SET @v_stmt_str = 'SELECT * FROM (' +isnull(@v_stmt_str, '')+') WHERE rn BETWEEN ' + isnull(@startidx, '') + ' AND '+ isnull(@endidx, '');
         INSERT INTO DYN_TEST (sql,proc_name,insrt_tm) VALUES(@v_stmt_str,@v_proc_name,getdate());

        EXECUTE(@v_stmt_str)
    END;
END;
GO

我正在这样调用存储过程:

DECLARE @rowcnt int;
DECLARE @p_user_msg varchar(MAX);

SET @rowcnt = NULL;
SET @p_user_msg = NULL;

EXEC WireMDM.dbo.GET_CLSFIED_BANK_INFO_BCP 
        @p_group_by = "bh",
        @p_bank_id = NULL,
        @p_addr = NULL,
        @p_cntry_cd = NULL,
        @startidx = NULL,
        @endidx = NULL,
        @rowcnt = @rowcnt output,
        @p_user_msg = @p_user_msg output;

PRINT @p_user_msg

准确无误地致电要求

0 个答案:

没有答案