我在动态sql中找不到错误

我在动态sql中找不到错误,sql,sql-server,datetime,dynamic-sql,sql-server-2014,Sql,Sql Server,Datetime,Dynamic Sql,Sql Server 2014,我对下面的存储过程代码有一个问题,它运行平稳,但当我尝试执行存储过程时,它会抛出以下错误: Msg 241,16级,状态1,程序附件文件清单,第27行 从字符串转换日期和/或时间时,转换失败 我猜它的日期从和日期到?从其外部声明为日期时间格式。在执行存储过程时,我尝试了2001-01-01和01-01-2001格式。两人都犯了同样的错误。 我正在使用SQL Server 2014管理工作室 那么,有人知道问题出在哪里吗 ALTER PROCEDURE [dbo].[ACC_ARAP_DOC_LI

我对下面的存储过程代码有一个问题,它运行平稳,但当我尝试执行存储过程时,它会抛出以下错误:

Msg 241,16级,状态1,程序附件文件清单,第27行 从字符串转换日期和/或时间时,转换失败

我猜它的日期从和日期到?从其外部声明为日期时间格式。在执行存储过程时,我尝试了2001-01-01和01-01-2001格式。两人都犯了同样的错误。 我正在使用SQL Server 2014管理工作室

那么,有人知道问题出在哪里吗

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>=' + @DATE_FROM +' AND acc_date<=' + @DATE_TO + ' ' +
       (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

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

在您的存储过程中,应该包含两个变量@DATE\u FROM和@DATE\u TO。它必须是convert varchar。像这样

SET @WHERE = ' WHERE acc_date>=' +convert(varchar(25), @DATE_FROM )+' AND acc_date<=' +convert(varchar(25), @DATE_TO) + ' ' +

在您的存储过程中,应该包含两个变量@DATE\u FROM和@DATE\u TO。它必须是convert varchar。像这样

SET @WHERE = ' WHERE acc_date>=' +convert(varchar(25), @DATE_FROM )+' AND acc_date<=' +convert(varchar(25), @DATE_TO) + ' ' +

您需要将日期时间参数转换为合适的字符串,以便将其构建到动态SQL字符串中。例如,而不是:

... 
SET @WHERE = ' WHERE acc_date>=' + @DATE_FROM +' AND acc_date<=' + @DATE_TO + ' ' +...

我建议您打印@SQL而不是SP_EXEC SQL@SQL,以帮助调试。

您需要将日期时间参数转换为合适的字符串,以便将其构建到动态SQL字符串中。例如,而不是:

... 
SET @WHERE = ' WHERE acc_date>=' + @DATE_FROM +' AND acc_date<=' + @DATE_TO + ' ' +...

我建议您打印@SQL而不是SP_EXEC SQL@SQL,以帮助调试。

您需要将@date_from和@date_的值转换为NVARCHAR。之后,需要在其周围设置括号

替换此项:

SET @WHERE = ' WHERE acc_date>=' + @DATE_FROM +' AND acc_date<=' + @DATE_TO + '
为此:

SET @WHERE = ' WHERE acc_date>=''' + CONVERT(nvarchar(max),@DATE_FROM) +''' AND acc_date<=''' + CONVERT(nvarchar(max),@DATE_TO) + '''
顺便说一句,您也应该提高@sql值,以避免一些截断错误。
您将NVARCH4000用于@sql。相反,尝试使用nvarcharmax。如果您的SQL可能变得冗长,则可以避免错误。

您需要将@date\u from和@date\u的值转换为NVARCHAR。之后,需要在其周围设置括号

替换此项:

SET @WHERE = ' WHERE acc_date>=' + @DATE_FROM +' AND acc_date<=' + @DATE_TO + '
为此:

SET @WHERE = ' WHERE acc_date>=''' + CONVERT(nvarchar(max),@DATE_FROM) +''' AND acc_date<=''' + CONVERT(nvarchar(max),@DATE_TO) + '''
顺便说一句,您也应该提高@sql值,以避免一些截断错误。

您将NVARCH4000用于@sql。相反,尝试使用nvarcharmax。如果您的SQL可能变得冗长,则可以避免错误。

您使用的是哪种数据库管理系统,以及ISO-8601日期格式的日期值:YYYYMMDD-无破折号,无空格-无。如果您只需要日期而不需要时间,请使用日期数据类型!我使用MSSQL,其值通常为“2014-01-01”和“2015-12-31”。@marc_s我得到了这个错误:Msg 402,16级,状态1,程序ACC_ARAP_DOC_列表,第32行数据类型varchar和date在add运算符中不兼容。您使用的是哪种dbms,date和date中的值来自ISO-8601日期格式:YYYYMMDD-无虚线,无空格-无。如果您只需要日期而不需要时间,请使用日期数据类型!我使用MSSQL,值通常是“2014-01-01”和“2015-12-31”。@marc_s我得到了这个错误:Msg 402,级别16,状态1,过程ACC_ARAP_DOC_LIST,第32行。数据类型varchar和date在add运算符中不兼容。Msg 102,级别15,状态1,第8行“1”附近的语法不正确。添加调用存储过程dataEXEC return_value=[dbo]。[ACC_ARAP_文件清单]日期从=N'2001-01-01',日期到=N'2015-12-31',文档类型组=N'DIV',结果模式=NULL-N'DOC\u SUM'选择返回值'=Return\u值GO只需查看此部分->日期从=N'2001-01-01',日期到=N'2015-12-31'Msg 102,级别15,状态1,第8行“1”附近的语法不正确。添加调用存储过程dataEXEC Return\u值=[dbo]。[ACC_ARAP_文件清单]日期从=N'2001-01-01',日期到=N'2015-12-31',文档类型组=N'DIV',结果模式=NULL-N'DOC\u SUM'SELECT'Return Value'=Return\u Value Go只要看看这部分->日期从=N'2001-01-01',日期到=N'2015-12-31'@DATE\u FROM='2001-01-01'和@DATE\u TO='2015-12-31',然后我得到了这个错误:Msg 102,级别15,状态1,第8行不正确yntax接近'00'。@DATE_FROM='2001-01-01'和@DATE_TO='2015-12-31'然后我得到了这个错误:Msg 102,级别15,状态1,第8行'00'附近的语法不正确。