Sql server 在基于变量值的UPDATE语句中使用什么WHERE子句
我有一个Sql server 在基于变量值的UPDATE语句中使用什么WHERE子句,sql-server,tsql,Sql Server,Tsql,我有一个UPDATE语句,其中我设置了一个变量@peims2017SnapshotDate,根据它的值,我需要确定使用哪个where子句 在SQL Server 2014中,我在@ISTRUE=1之后遇到一个IntelliSense错误,其中单词where有不正确的语法错误 我相信有更好的方法来处理这件事,但我现在处于困境 以下是我的SQL代码: UPDATE t SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Ef
UPDATE
语句,其中我设置了一个变量@peims2017SnapshotDate
,根据它的值,我需要确定使用哪个where子句
在SQL Server 2014中,我在@ISTRUE=1
之后遇到一个IntelliSense错误,其中单词where
有不正确的语法错误
我相信有更好的方法来处理这件事,但我现在处于困境
以下是我的SQL代码:
UPDATE t
SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Effective_Date),101),
t.LastUpdated = GETDATE(),
t.UpdatedAppType = 'HHS_update',
t.DataSource = 'HHS'
FROM dbo.vw_HHSurvey s
INNER JOIN dbo.Focus_Econ_Disadvantaged_Last_Snapshot t
ON s.CustomerID = t.StudentID
AND s.SiteID = t.Location
SET @ISTRUE = (SELECT CASE WHEN CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate THEN 1 ELSE 0 END)
IF @ISTRUE = 1
WHERE CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate)
AND CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE'))
IF @ISTRUE = 0
WHERE CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE'))
> <代码> >筛选器> 中,您不能<代码>设置<代码>代码>变量> 请尝试以下方法:
UPDATE t
SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Effective_Date),101),
t.LastUpdated = GETDATE(),
t.UpdatedAppType = 'HHS_update',
t.DataSource = 'HHS'
FROM dbo.vw_HHSurvey s
INNER JOIN dbo.Focus_Econ_Disadvantaged_Last_Snapshot t
ON s.CustomerID = t.StudentID
AND s.SiteID = t.Location
WHERE (
CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
AND CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE')
)
OR
NOT(CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate)
AND CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE')
)
)
> <代码> >筛选器> 中,您不能<代码>设置<代码>代码>变量> 请尝试以下方法:
UPDATE t
SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Effective_Date),101),
t.LastUpdated = GETDATE(),
t.UpdatedAppType = 'HHS_update',
t.DataSource = 'HHS'
FROM dbo.vw_HHSurvey s
INNER JOIN dbo.Focus_Econ_Disadvantaged_Last_Snapshot t
ON s.CustomerID = t.StudentID
AND s.SiteID = t.Location
WHERE (
CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
AND CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE')
)
OR
NOT(CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate)
AND CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE')
)
)
因为当@ISTRUE为1或0时,您的一些条件都起作用,所以我简化了一些。当您尝试此操作时,请务必检查结果是否相同
DECLARE @ISTRUE int, @peims2017SnapshotDate datetime
SET @peims2017SnapshotDate = getdate()-- note this was placed here just to see if the syntax passed, use whatever declaration and population you have for this variable
SET @ISTRUE = (SELECT
CASE
WHEN CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
THEN 1 ELSE 0 END);
UPDATE t
SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Effective_Date),101),
t.LastUpdated = GETDATE(),
t.UpdatedAppType = 'HHS_update',
t.DataSource = 'HHS'
FROM dbo.vw_HHSurvey s
INNER JOIN dbo.Focus_Econ_Disadvantaged_Last_Snapshot t
ON s.CustomerID = t.StudentID
AND s.SiteID = t.Location
WHERE CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND (
(t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE')
)
and (
(
@ISTRUE = 1
AND CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
)
OR @ISTRUE = 0
);
因为当@ISTRUE为1或0时,您的一些条件都起作用,所以我简化了一些。当您尝试此操作时,请务必检查结果是否相同
DECLARE @ISTRUE int, @peims2017SnapshotDate datetime
SET @peims2017SnapshotDate = getdate()-- note this was placed here just to see if the syntax passed, use whatever declaration and population you have for this variable
SET @ISTRUE = (SELECT
CASE
WHEN CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
THEN 1 ELSE 0 END);
UPDATE t
SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Effective_Date),101),
t.LastUpdated = GETDATE(),
t.UpdatedAppType = 'HHS_update',
t.DataSource = 'HHS'
FROM dbo.vw_HHSurvey s
INNER JOIN dbo.Focus_Econ_Disadvantaged_Last_Snapshot t
ON s.CustomerID = t.StudentID
AND s.SiteID = t.Location
WHERE CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND (
(t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE')
)
and (
(
@ISTRUE = 1
AND CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
)
OR @ISTRUE = 0
);
虽然其他人已经指出,您不能在UPDATE语句的中间使用SET,并且您通常必须执行两次检查并在备选方案之间添加或,或者在CASE方面更具创造性,但以下情况进一步简化了您的查询,因为WHERE条件对于两个条件都完全相同,唯一的区别是,如果条件为真,您将执行附加检查:
UPDATE t
SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Effective_Date),101),
t.LastUpdated = GETDATE(),
t.UpdatedAppType = 'HHS_update',
t.DataSource = 'HHS'
FROM dbo.vw_HHSurvey s
INNER JOIN dbo.Focus_Econ_Disadvantaged_Last_Snapshot t
ON s.CustomerID = t.StudentID
AND s.SiteID = t.Location
AND CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE'))
AND (CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate AND CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
OR CAST(t.StatusEffectiveDate as date) <= @peims2017SnapshotDate)
更新t
设置t.Enddate=CONVERT(VARCHAR(10),DATEADD(day,-1,s.Effective_Date),101),
t、 LastUpdated=GETDATE(),
t、 UpdatedAppType='HHS_update',
t、 数据源='HHS'
来自dbo.vw\U HHS调查
内部连接dbo.Focus\u Econ\u Last\u Snapshot
在s.CustomerID=t.StudentID上
s.SiteID=t.位置
和转换(日期,s.Effective_date,101)>转换(日期,t.status effectivedate,101)
和((t.[状态]='已支付'和s.[状态]!='已支付')
或(t.[Status]=“Reduced”和s.[Status]=“FREE”)
和(CAST(t.StatusEffectiveDate作为日期)>@peims2017快照日期和CAST(t.StatusEffectiveDate作为日期)>@peims2017快照日期
或强制转换(t.StatusEffectiveDate为日期)虽然其他人已经指出,您不能在UPDATE语句的中间使用SET,并且您通常必须进行两次检查并在备选方案之间添加OR,或者在CASE方面更具创造性,但以下事实进一步简化了您的查询,即当两个条件的条件完全相同时,唯一的区别是如果条件为真,则执行附加检查:
UPDATE t
SET t.Enddate = CONVERT(VARCHAR(10), DATEADD(day, -1, s.Effective_Date),101),
t.LastUpdated = GETDATE(),
t.UpdatedAppType = 'HHS_update',
t.DataSource = 'HHS'
FROM dbo.vw_HHSurvey s
INNER JOIN dbo.Focus_Econ_Disadvantaged_Last_Snapshot t
ON s.CustomerID = t.StudentID
AND s.SiteID = t.Location
AND CONVERT(date, s.Effective_Date, 101) > CONVERT(date, t.StatusEffectiveDate, 101)
AND ((t.[Status] = 'Paid' AND s.[Status] != 'PAID')
OR (t.[Status] = 'Reduced' AND s.[Status] = 'FREE'))
AND (CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate AND CAST(t.StatusEffectiveDate as date) > @peims2017SnapshotDate
OR CAST(t.StatusEffectiveDate as date) <= @peims2017SnapshotDate)
更新t
设置t.Enddate=CONVERT(VARCHAR(10),DATEADD(day,-1,s.Effective_Date),101),
t、 LastUpdated=GETDATE(),
t、 UpdatedAppType='HHS_update',
t、 数据源='HHS'
来自dbo.vw\U HHS调查
内部连接dbo.Focus\u Econ\u Last\u Snapshot
在s.CustomerID=t.StudentID上
s.SiteID=t.位置
和转换(日期,s.Effective_date,101)>转换(日期,t.status effectivedate,101)
和((t.[状态]='已支付'和s.[状态]!='已支付')
或(t.[Status]=“Reduced”和s.[Status]=“FREE”)
和(CAST(t.StatusEffectiveDate作为日期)>@peims2017快照日期和CAST(t.StatusEffectiveDate作为日期)>@peims2017快照日期
或CAST(t.StatusEffectiveDate as date)您不能这样做。它不是有效的sql。但是,您可以在where子句中放置CASE语句。您不能这样做。它不是有效的sql。但是,您可以在where子句中放置CASE语句。实际上,您可以在UPDATE语句中设置变量。这通常被称为“古怪的更新”。它没有得到Microsoft的官方支持,但如果做得好,它确实可以工作。这里有一篇关于这个主题的更好的文章…太疯狂了!谢谢你的链接!嗨,Oreo,我感谢你的快速回复。当我尝试你的建议时,我在not中遇到了一个错误(案例说明:在预期条件的上下文中指定的非布尔型表达式。有什么建议吗?再次感谢您的时间和帮助。对不起,Melinda,我在没有测试的情况下盲目编码,因为我不接近SSMS。请尝试最新的代码,我在
时删除了案例。是的……不用担心。这是一个很酷的技术。)在SQL 2012扩展了窗口功能的实用性并引入了窗口框架之后,它失去了相当一部分的实用性。它仍然有它的用途,正如您知道它的局限性一样。实际上,您可以在UPDATE语句中设置变量。这通常被称为“古怪的更新”。它没有得到Microsoft的官方支持,但如果做得好,它确实可以工作。这里有一篇关于这个主题的更好的文章…太疯狂了!谢谢你的链接!嗨,Oreo,我感谢你的快速回复。当我尝试你的建议时,我在not中遇到了一个错误(案例说明:在预期条件的上下文中指定的非布尔型表达式。有什么建议吗?再次感谢您的时间和帮助。对不起,Melinda,我在没有测试的情况下盲目编码,因为我不接近SSMS。请尝试最新的代码,我在
时删除了案例。是的……不用担心。这是一个很酷的技术。)但在SQL 2012扩展了窗口功能的实用性并引入了窗口框架之后,它失去了相当多的实用性。它仍然有它的用途,正如您知道的那样,它的局限性。