我有此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
准确无误地致电要求