首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >date time变量的动态sql语法问题

date time变量的动态sql语法问题
EN

Stack Overflow用户
提问于 2013-02-26 03:47:43
回答 2查看 5.7K关注 0票数 2

对于这段代码,当我引入两个日期变量时,代码会出现错误。

错误是

代码语言:javascript
复制
Msg 137, Level 15, State 1, Line 8
Must declare the scalar variable "@STARTDATE".
Msg 137, Level 15, State 1, Line 9
Must declare the scalar variable "@ENDDATE".

我的大脑现在正式死亡了,你知道该怎么解决这个问题吗?

代码语言:javascript
复制
DECLARE 
    @Query1  AS NVARCHAR(MAX),
    @Startdate DATETIME,
    @Enddate DATETIME

SET @STARTDATE = '10-JAN-2012'
SET @ENDDATE = '11-JAN-2012'

SET @Query1 = '

;WITH CTE AS
(
    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] ON SU.SYS_USER_ID=JB.SYS_USER_ID

where P.[PRODUCT_CATEGORY_ID]= ''PADS'' 
    and C.COMPANY_ID= ''19992''
    and PA.DATE_RECEIVED BETWEEN @Startdate AND @Enddate 

group by PT.DESCRIPTION, P.DESCRIPTION
)' 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-26 03:53:59

您的参数超出了sql查询的范围。您需要将参数传递到sql字符串中。您会注意到,您还必须将参数转换为varchar,以便可以将其连接到字符串:

代码语言:javascript
复制
DECLARE 
    @Query1  AS NVARCHAR(MAX),
    @Startdate DATETIME,
    @Enddate DATETIME

SET @STARTDATE = '10-JAN-2012'
SET @ENDDATE = '11-JAN-2012'

SET @Query1 = '

;WITH CTE AS
(
    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] ON SU.SYS_USER_ID=JB.SYS_USER_ID

where P.[PRODUCT_CATEGORY_ID]= ''PADS'' 
    and C.COMPANY_ID= ''19992''
    and PA.DATE_RECEIVED BETWEEN '+ convert(varchar(10), @Startdate, 120) 
    + ' AND '+ convert(varchar(10), @Enddate, 120) +' 

group by PT.DESCRIPTION, P.DESCRIPTION
)' 

不过,我不确定您为什么要在此过程中使用动态SQL。这可以在不使用动态SQL的情况下轻松执行:

代码语言:javascript
复制
;WITH CTE AS
(
    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] ON SU.SYS_USER_ID=JB.SYS_USER_ID

where P.[PRODUCT_CATEGORY_ID]= 'PADS'
    and C.COMPANY_ID= '19992'
    and PA.DATE_RECEIVED BETWEEN @Startdate AND @Enddate

group by PT.DESCRIPTION, P.DESCRIPTION
)
票数 6
EN

Stack Overflow用户

发布于 2013-02-26 03:57:03

如果这确实需要动态SQL,您应该执行以下操作:

代码语言:javascript
复制
-- USE UNAMBIGUOUS FORMATS PLEASE!

SET @STARTDATE = '20120110';
SET @ENDDATE = '20120111';

SET @Query1 = ';WITH CTE AS
...
    and PA.DATE_RECEIVED BETWEEN @STARTDATE AND @ENDDATE 
    group by PT.DESCRIPTION, P.DESCRIPTION
)';

EXEC sp_executesql 
  @Query1, 
  N'@STARTDATE DATETIME, @ENDDATE DATETIME',
  @STARTDATE, @ENDDATE;

但是,除非我遗漏了什么,否则这里没有必要使用动态SQL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15075179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档