我有一张桌子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)
我怎样才能做到这一点?有一种原子方式来进行交换吗?建议?
我是一个很长一段时间的桌面应用程序 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)
对不起,我是个菜鸟。
我有以下数据
| 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) 我正在尝试编写一个更新列的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命令有什么特别之处导致它以这种方式运行吗?
我有一个存储过程本身按顺序调用其他存储过程的列表:
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,则会正确生成摘要数据.
我有一个审计表,其中包含插入,更新和删除操作的数据.我正在编写一个报告,它将按插入,更新和删除的顺序显示数据.我不认为order by子句会有所帮助.任何帮助?
我在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
两个日期都存储在一个表中.如果date1更大,我想返回date1,如果date2更大,我想返回date2.我希望它们成为更大的查询的一部分,所以我想要一个主要的查询,但如果这是不可能的,我可以使用临时表,然后使用第二个查询.代码将在存储过程中执行.
任何人都可以向我解释上述内容.我对上述概念感到困惑.
如果我运行这两个函数,我会得到不同的结果.将datetime.Now在DOTNET正显示出同样的结果,因为它是在系统时间显示,同时有大约20分钟的区别,如果我使用getdate()...的原因是什么,以及如何克服呢?