错误消息'过程没有参数'

时间:2015-07-07 08:43:11

标签: sql sql-server datetime parameters dynamic-sql

当我执行存储过程时,它会向我抛出此错误:

  

Msg 8146,Level 16,State 1,Line 2

     

程序没有提供参数和参数。

我在想,因为我在DATETIME格式中遇到了一些问题,不得不连接或转换它们。在那之后,我得到了上面的错误。

任何人都知道代码有什么问题吗?

ALTER PROCEDURE [dbo].[ACC_ARAP_DOC_LIST]
    @DATE_FROM DATETIME,
    @DATE_TO DATETIME,
    @DOC_TYPE_GROUP CHAR(20)='DIV',
    @FILTER_CONDITION NVARCHAR(4000)='',
    @RESULT_MODE NVARCHAR(30)= NULL --'DOC_SUM'
AS
BEGIN 
    DECLARE @SQL NVARCHAR(4000) --Select
    DECLARE @SQL2 NVARCHAR(4000)
    DECLARE @WHERE NVARCHAR(4000)
    DECLARE @PARAMETER NVARCHAR(1000)
    DECLARE @GROUP_BY NVARCHAR(4000)
    DECLARE @GROUP_ORDER_BY NVARCHAR(4000)
    DECLARE @ORDER_BY NVARCHAR(4000)
    DECLARE @SQL_SUM_START NVARCHAR(4000)
    DECLARE @SQL_SUM_END NVARCHAR(4000)

    SET @SQL = 'SELECT * FROM (SELECT j1.journal_no, j1.acc_date, j1.partner_code, j1.term_code, j1.due_date, j1.ref_no1, j1.ref_no2,
                                j1.description,j1.sales_person,j1.pay_remark ,j1.amount,j1.acc_amount,j1.currency, j1.match_acc_amount, p1.name as partner_name
                                FROM acc_journal j1 
                                INNER JOIN acc_journal_groupcfg g1 ON g1.group_type=''LST'' AND g1.doc_type_group='''+ @DOC_TYPE_GROUP +''' AND g1.doc_type=j1.doc_type
                                 LEFT OUTER JOIN partner p1 ON j1.partner_code=p1.partner_code 
                                 LEFT OUTER JOIN partner_acc p2 ON p1.partner_id=p2.partner_id) as sql1'
    SET @WHERE = ' WHERE acc_date>=' + convert(varchar(10), @DATE_FROM, 120) +' AND acc_date<=' +convert(varchar(10), @DATE_TO, 120) + ' ' +
       (CASE WHEN ISNULL(@filter_condition,'')<>'' 
                    THEN 'AND '+@filter_condition ELSE '' END)
    SET @ORDER_BY = ' ORDER BY journal_no'

    SET @PARAMETER = '@DATE_FROM DATETIME,@DATE_TO DATETIME,@RESULT_MODE NVARCHAR(30)=''DOC_SUM'',@DOC_TYPE_GROUP CHAR(20)'


    SET @SQL = @SQL + @WHERE + @ORDER_BY

    IF @RESULT_MODE = 'DOC_SUM'
    BEGIN
        SET @SQL = 'SELECT * FROM (SELECT j1.journal_no, j1.acc_date, j1.partner_code as Code, j1.term_code, j1.due_date, j1.ref_no1, j1.ref_no2,
                                j1.description,j1.sales_person,j1.pay_remark ,j1.amount,j1.acc_amount,j1.currency, j1.match_acc_amount, p1.name as Name
                                FROM acc_journal j1 
                                INNER JOIN acc_journal_groupcfg g1 ON g1.group_type=''LST'' AND g1.doc_type_group='''+@DOC_TYPE_GROUP +'''AND g1.doc_type=j1.doc_type
                                LEFT OUTER JOIN partner p1 ON j1.partner_code=p1.partner_code 
                                LEFT OUTER JOIN partner_acc p2 ON p1.partner_id=p2.partner_id) as sql1'
        SET @SQL_SUM_START= 'SELECT Code, Name, COUNT(*) as Count, SUM(acc_amount) as Total_Amount FROM ('
        SET @SQL_SUM_END= ') as SQLsum'

        SET @GROUP_BY = ' GROUP BY Code, Name'
        SET @GROUP_ORDER_BY = ' ORDER BY Code, Name'
        SET @SQL2 = @SQL_SUM_START + @SQL +@SQL_SUM_END + @GROUP_BY + @GROUP_ORDER_BY
    END

    SET @SQL = 'SELECT * FROM (SELECT j1.journal_no, j1.acc_date, j1.partner_code, j1.term_code, j1.due_date, j1.ref_no1, j1.ref_no2,
                                j1.description,j1.sales_person,j1.pay_remark ,j1.amount,j1.acc_amount,j1.currency, j1.match_acc_amount, p1.name as partner_name
                                FROM acc_journal j1 
                                INNER JOIN acc_journal_groupcfg g1 ON g1.group_type=''LST'' 
                                 AND g1.doc_type_group='''+@DOC_TYPE_GROUP+'''
                                 AND g1.doc_type=j1.doc_type
                                 LEFT OUTER JOIN partner p1 ON j1.partner_code=p1.partner_code 
                                 LEFT OUTER JOIN partner_acc p2 ON p1.partner_id=p2.partner_id) as sql1'
    SET @SQL = @SQL + @WHERE + @ORDER_BY

    --PRINT @SQL
    EXEC sp_executesql @SQL, @SQL2, @PARAMETER,
    @DOC_TYPE_GROUP=@DOC_TYPE_GROUP,
    @DATE_FROM=@DATE_FROM,
    @DATE_TO=@DATE_TO
END

1 个答案:

答案 0 :(得分:1)

您的查询存在一些问题。这一切归结为最后一个sp_executesql命令。

发生实际错误是因为您没有将_USE_32BIT_TIME_T设置为空字符串以外的任何内容(除非@SQL2已被赋予特定值)。这意味着@RESULT_MODE被赋予一个空白的参数列表,然后您仍然传入其他参数。

  1. 您正在传递sp_executesql作为第二个参数。我不认为这是必要的。它并不总是设置为任何东西,当它是,它是@SQL2它自己的陈述。第二个参数应该是您传入的参数列表。

  2. 您传递的参数似乎根本不会被使用。在动态SQL中使用它们或完全删除它们。

  3. 在不了解您的架构/数据的情况下,它不可能更具体,但看起来您的最后一行可能只是:

    SELECT