Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在基于变量值的UPDATE语句中使用什么WHERE子句_Sql Server_Tsql - Fatal编程技术网

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扩展了窗口功能的实用性并引入了窗口框架之后,它失去了相当多的实用性。它仍然有它的用途,正如您知道的那样,它的局限性。