带日期的动态sql语法

带日期的动态sql语法,sql,sql-server,Sql,Sql Server,我的动态sql中的这一行提供了一些动态数据透视,它似乎没有接收正确的日期并返回预期的结果。查询将运行并且不返回任何结果 and PA.DATE_RECEIVED BETWEEN '+ convert(varchar(10), @Startdate, 120) +' AND '+ convert(varchar(10), @Enddate, 120) +' 检查以查看它拾取的值。。。存储过程中的一些sql select convert(varchar(10), @Startdate, 120)

我的动态sql中的这一行提供了一些动态数据透视,它似乎没有接收正确的日期并返回预期的结果。查询将运行并且不返回任何结果

and PA.DATE_RECEIVED BETWEEN 
'+ convert(varchar(10), @Startdate, 120) +' AND '+ convert(varchar(10), @Enddate, 120) +'
检查以查看它拾取的值。。。存储过程中的一些sql

select convert(varchar(10), @Startdate, 120) - 2013-02-02    
select convert(varchar(10), @Enddate, 120) - 2013-02-26
在普通sql外部运行查询,是否有效?问题是什么

select COALESCE( PT.[description] , 'Grand Total') AS [Transaction Type], 
           Sum (AI.PRICE_INC_VAT) AS [AMOUNT (ú) CREDIT],
           P.[DESCRIPTION] AS [PRODUCT TYPE]    
From  [dbo].[T1] C     
join [dbo].[T2] S on S.[Customer_ID]=C.[Customer_ID]     
join [dbo].[T3] SO on SO.[SITE_ID]=S.[SITE_ID]    
join [dbo].[T4] OI on OI.[ORDER_ID]=SO.[SITE_ORDER_ID]    
left join [dbo].[T5] P on P.[PRODUCT_ID]=OI.[PRODUCT_ID]    
JOIN [dbo].[T6] AI ON  AI.ORDER_ITEM_ID = OI.ORDER_ITEM_ID    
JOIN T7 JBAI ON JBAI.ACTION_ITEM_ID = AI.ACTION_ITEM_ID    
JOIN T8 JB ON JB.JOB_BATCH_ID = JBAI.JOB_BATCH_ID    
JOIN T9 PA on PA.PAYMENT_ID=JB.PAYMENT_ID    
LEFT JOIN T10 CU ON JB.CUSTOMER_USER_ID = CU.CUSTOMER_USER_ID    
JOIN T11 PT ON PT.PAYMENT_TYPE_ID=PA.PAYMENT_TYPE_ID     
LEFT JOIN T12 SU ON SU.SYS_USER_ID=JB.SYS_USER_ID   
where P.[PRODUCT_CATEGORY_ID]= ( 
                        select PC.[PRODUCT_CATEGORY_ID] from [dbo].[PRODUCT_CATEGORY] PC 
                        where PC.[DESCRIPTION]='BAGS')     
and C.COMPANY_ID= '12'    
and PA.DATE_RECEIVED BETWEEN '02-FEB-2013' AND '26-FEB-2013'    
group by PT.DESCRIPTION, P.DESCRIPTION 
你试过这个吗:

and PA.DATE_RECEIVED BETWEEN @Startdate AND @Enddate

您不必转换日期以使Interween语句起作用

您可能缺少日期周围的单引号,而不是2013-02-02和2013-02-26之间收到的
PA.DATE\u
请尝试读取字符串:
PA.DATE\u在'2013-02-02'和'2013-02-26'之间收到的日期。
。下面是一个如何获取字符串中的单引号的示例:

DECLARE @var VARCHAR(1000) = 
    'and PA.DATE_RECEIVED BETWEEN ''' + 
    convert(varchar(10), GETDATE(), 120) +
    ''' AND ''' + 
    convert(varchar(10), GETDATE(), 120) + ''''

SELECT @var

文本字符串中的单引号由
'

表示。我认为您遇到了引号问题。注意转义的引号,使单个引号出现在动态查询中

和PA.U收到的日期
''+convert(varchar(10),@Startdate,120)+'''+convert(varchar(10),@Enddate,120)+'

我认为您的查询中存在一些问题,(1)形成sql字符串,(2)尝试将日期与varchar值进行比较,(3)将字符串转换为日期

例如,它应该是这样的

declare @sql nvarchar(max), 
        @startdate varchar(50) = '20130202', --Using ISO format (yyyymmdd)
        @enddate varchar(50) = '20130226' --Using ISO format 

select @sql = 'SELECT col1, col2, ... FROM myTable WHERE mydate '+
               'between convert(date, ' + @startdate + ') and ' +
               'convert(date, ' + @enddate + ')' 

在对包含动态SQL的连接字符串调用
EXEC()
sp_executesql
之前,请调用
PRINT@yourVariableName
并查看其输出内容,然后尝试在SSMS中运行此类查询,查看它与返回结果的查询的不同之处。PRINT变量显示2013-02-02和2013-02-26之间收到的动态sql as和PA.DATE_行。
PA.DATE_RECEIVED
字段的数据类型是什么?varchar或date/datetime?给出错误消息137,级别15,状态2,第39行必须声明标量变量“@Startdate”。它不起作用,因为这是一个包含
SELECT
语句的动态查询,它不包含变量声明,它无法看到未在包含动态SQL.Closer的字符串中声明的变量。现在进入prtin变量。和PA.DATE_在“2013-02-02”和“2013-02-26”之间收到。但现在获取错误sg 242,级别16,状态3,第3行将varchar数据类型转换为datetime数据类型导致值超出范围。将行更改为“”+转换(varchar(10),Startdate,120)+“”和“”+转换(varchar(10),Enddate,120)之间接收到PA.DATE_本评论中未包含的+''符号尝试将格式120替换为112(ISO格式),例如:
convert(varchar(10),@Startdate,112)
convert(varchar(10),@Enddate,112)