【问题标题】:How do I merge this update code with this code below?如何将此更新代码与以下代码合并?
【发布时间】:2019-12-23 19:11:44
【问题描述】:

基本上,如果下面的这个函数为真,我会尝试更新日期。

我将在 MS Visual Studio 中使用此代码将其与选中列表框中选中项的索引进行比较...

UPDATE rent 
SET dat_vrac = CONVERT(smalldatetime, CURRENT_TIMESTAMP)


(SELECT CAST(rownumber AS VARCHAR)
FROM (SELECT dat_vrac, row_number() 
       OVER (order by dat_vrac) AS 'rownumber'
       FROM rent) TableExpressionsMustHaveAnAliasForDumbReasons
WHERE (
  cast (rownumber as varchar)
  ) > '0')


SqlCommand komanda = new SqlCommand("WITH CTE_RENT AS ( SELECT dat_vrac, ROW_NUMBER() OVER (order by dat_vrac) rn FROM rent) UPDATE CTE_RENT SET dat_vrac = CONVERT(SMALLDATETIME, CURRENT_TIMESTAMP) WHERE rn ='" + chlb_return.Items.Cast<int>() + "'", konekcija);

【问题讨论】:

  • 你打算用这个逻辑做什么?不是更新语句,而是它下面的所有行号?
  • 基本上我之后要做的是找到行号并将其与选中的列表框索引进行比较。出于某种原因,我必须将其转换为 varchar。
  • SqlCommand komanda = new SqlCommand("SELECT CAST(rownumber AS VARCHAR) FROM (SELECT dat_vrac, row_number() OVER (order by dat_vrac) AS 'rownumber' FROM rent) TableExpressionsMustHaveAnAliasForDumbReasons WHERE (cast (rownumber as varchar)) &gt; '" + chlb_return.Items.Cast&lt;int&gt;() + "'", konekcija);
  • 我真的很抱歉,我试图用我能做到的最好的方式来解释这个......

标签: sql-server tsql sql-update


【解决方案1】:

因为您不喜欢为子查询使用别名。

并且 ROW_NUMBER 以 1 开头,而不是 0。

所以试试这个:

WITH CTE_RENT AS
(
    SELECT dat_vrac
    , ROW_NUMBER() OVER (ORDER BY dat_vrac) rn
    FROM rent
)
UPDATE CTE_RENT 
SET dat_vrac = CONVERT(SMALLDATETIME, CURRENT_TIMESTAMP)
WHERE rn > 1

但可能是 ROW_NUMBER 需要由只有您知道的东西进行分区。

    , ROW_NUMBER() OVER (PARTITION BY house_id ORDER BY dat_vrac) rn

【讨论】:

  • 嘿LukStorms!非常感谢你的回答,我比你想象的更感激。我似乎没有完全解释这一点......我现在编辑了这篇文章。我需要它是 varchar,因为如果不是,Visual Studio 会给我一个错误。
  • 一些具有预期结果的简单假样本数据通常有助于解释您的意图。但在尝试更新之前,只需在只有一个 SELECT 的 SSMS 之类的工具中进行选择。这样您就可以了解要更新的内容。不要盲目相信 SQL。
  • 顺便说一句,rn 是一个 INT。所以不需要在你的 SqlCommand 中加上单引号。目前我不明白你想要做什么。更新第 N 条记录的日期?
  • SqlCommand komanda = new SqlCommand("WITH CTE_RENT AS (SELECT dat_vrac, ROW_NUMBER() OVER (ORDER BY dat_vrac) rn FROM rent) UPDATE CTE_RENT SET dat_vrac = CONVERT(SMALLDATETIME, CURRENT_TIMESTAMP) WHERE (cast ( rn as varchar)) = '" + 6 + "'", konekcija);
  • 例如,请参见此处,我将 checkedListItems 更改为第 6 位。像这样它正在工作,但现在我无法将 checkedListItems 更改为数字...还尝试了 CheckedIndices
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
相关资源
最近更新 更多