小编gbn*_*gbn的帖子

在不违反约束的情况下交换两个DB行

我有一张桌子regionkey:

areaid  -- primary key, int
region  -- char(4)
locale  -- char(4)
Run Code Online (Sandbox Code Playgroud)

数据库的其余部分都是外键到areaid.在此表中,有一个具有唯一约束的(区域,区域设置)索引.

问题是我有两条记录:

101   MICH   DETR
102   ILLI   CHIC
Run Code Online (Sandbox Code Playgroud)

我需要在它们之间交换(区域,区域设置)字段,以便我最终得到:

101   ILLI   CHIC
102   MICH   DETR
Run Code Online (Sandbox Code Playgroud)

天真的方法不起作用,因为它违反了区域和​​区域设置的唯一索引:

update regionkey
     set region='ILLI', locale='CHIC' where areaid = 101; -- FAILS
update regionkey
     set region='MICH', locale='DETR' where areaid = 102;
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?有一种原子方式来进行交换吗?建议?

sql t-sql sql-server atomic

5
推荐指数
1
解决办法
1457
查看次数

SQL INSERT INTO 返回自动增量字段

我是一个很长一段时间的桌面应用程序 C++ 程序员,不熟悉 SQL。我需要插入一个带有 autoincrment 字段的表,并让该 sql 语句返回 autoincrement 字段的新值。

就像是:

INSERT INTO Entrys ('Name','Description')
VALUES ('abc','xyz')
SELECT Entrys.EntryID WHERE EntryID=[THE ONE JUST INSERTED!]
Run Code Online (Sandbox Code Playgroud)

对不起,我是个菜鸟。

sql auto-increment

5
推荐指数
1
解决办法
2万
查看次数

T-SQL:使用OVER和PARTITION BY

我有以下数据

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  10   | 01.01.2010
 |   1    |  20   | 02.01.2010
 |   1    |  30   | 03.01.2010
 |   1    |  40   | 04.01.2010
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 10.01.2010
 |   2    |  30   | 04.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 07.01.2010
 |   2    |  80   | 08.01.2010
 |   2    |  100  | 09.01.2010
Run Code Online (Sandbox Code Playgroud)

以下声明

SELECT   Item, Value, MIN(Date) …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2005

5
推荐指数
1
解决办法
1万
查看次数

UPDATE语句包含在IF EXISTS块中

我正在尝试编写一个更新列的DML脚本,但我想确保该列首先存在,所以我将它包装在IF EXISTS块中

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21
END
Run Code Online (Sandbox Code Playgroud)

所以奇怪的是,即使条件失败,它也会尝试执行更新.所以列不存在,UPDATE语句运行,我得到一个错误.为什么?

更奇怪的是,这确实有效:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    EXEC('UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21')
END
Run Code Online (Sandbox Code Playgroud)

UPDATE命令有什么特别之处导致它以这种方式运行吗?

sql t-sql sql-server

5
推荐指数
1
解决办法
1678
查看次数

存储过程 - 强制执行顺序

我有一个存储过程本身按顺序调用其他存储过程的列表:

CREATE PROCEDURE [dbo].[prSuperProc]

AS
BEGIN
    EXEC [dbo].[prProc1] 
    EXEC [dbo].[prProc2] 
    EXEC [dbo].[prProc3]
    --etc
END
Run Code Online (Sandbox Code Playgroud)

但是,我的表中有时会产生一些奇怪的结果,由prProc2生成,这取决于prProc1生成的结果.如果我按顺序手动执行prProc1,prProc2,prProc3,那么一切都很好.看来,当我运行顶级过程时,在Proc1完成之前正在执行Proc2并将其结果提交给db.它并不总是出错,但是当Proc1有一个很长的执行时间(在这种情况下〜10s)时似乎出错了.

如何更改prSuperProc,以便每个过程仅在前面的过程完成并提交后才执行?交易?

编辑额外的细节:

我的数据库中有一个表,它有一个默认为null的列.prProc1在此表上执行一组更新语句以填充此列.然后,prProc2根据此列中的值将摘要数据插入到辅助表中.

当我运行超级过程时,我(有时)看到的是第一个表具有由prProc1正确计算的结果,但是prProc2已生成结果,就像列全部为空.如果我然后手动运行prProc2,则会正确生成摘要数据.

t-sql sql-server stored-procedures

5
推荐指数
1
解决办法
7629
查看次数

Tsql按特定字符串值排序数据

我有一个审计表,其中包含插入,更新和删除操作的数据.我正在编写一个报告,它将按插入,更新和删除的顺序显示数据.我不认为order by子句会有所帮助.任何帮助?

sql t-sql sql-server

5
推荐指数
1
解决办法
4863
查看次数

如何在sql server 2008中插入触发器后使用

我在sql服务器上工作,我想在特定的表中插入记录说(a),这个表包含两列[id(身份字段)和名称(nvarchar(max)]现在在表中插入记录(a),触发器应该触发并在表b中插入标识字段值....我正在使用插入触发器之后为此目的,但我没有得到我将如何获得触发器中的标识字段值...应插入表b中.

这就是我正在使用的

create trigger tri_inserts on (a)
after insert
as
begin
   insert into b (id, name) values (?,?)
end
Run Code Online (Sandbox Code Playgroud)

请尽快回复..感谢和问候Abbas Electricwala

sql-server triggers identity sql-server-2008

5
推荐指数
2
解决办法
2万
查看次数

比较表中的两个日期并使用SQL返回更大的日期

两个日期都存储在一个表中.如果date1更大,我想返回date1,如果date2更大,我想返回date2.我希望它们成为更大的查询的一部分,所以我想要一个主要的查询,但如果这是不可能的,我可以使用临时表,然后使用第二个查询.代码将在存储过程中执行.

t-sql sql-server comparison date

5
推荐指数
1
解决办法
2万
查看次数

我们可以更新视图中的数据吗?

  1. 我们可以更新视图中的数据.如果是这样,它是否会反映实际表中的数据.
  2. 如果在该表上创建的视图存在,我们可以删除该表吗?

任何人都可以向我解释上述内容.我对上述概念感到困惑.

sql-server

5
推荐指数
1
解决办法
3226
查看次数

Getdate()函数返回的结果与dotnet中的DateTime.Now不同

如果我运行这两个函数,我会得到不同的结果.将datetime.Now在DOTNET正显示出同样的结果,因为它是在系统时间显示,同时有大约20分钟的区别,如果我使用getdate()...的原因是什么,以及如何克服呢?

.net sql-server

5
推荐指数
2
解决办法
1882
查看次数