每当在 CUSTOMER 表中发生 INSERT 时,我需要调用“ StoredProcedure1 ”并且在 CUSTOMER 表中发生 UPDATE,我需要在触发器中调用“ StoredProcedure2 ”。 如何确定是在 SQL Server 2008的触发器中插入还是更新。
有人可以请帮我如何解决?
代码:
CREATE TRIGGER Notifications ON CUSTOMER
FOR INSERT,UPDATE
AS
BEGIN
DECLARE @recordId varchar(20);
set @recordId= new.Id;
//if trigger is insert at the time I call to SP1
EXEC StoredProcedure1 @recordId
//if trigger is Upadeted at the time I call to SP2
EXEC StoredProcedure2 @recordId
END
Run Code Online (Sandbox Code Playgroud) 我在此存储过程开始时创建了一个临时表。它创建成功,可以从中选择和插入。这是创建语句
CREATE TABLE #tmpImportData
( GuideFirstName VARCHAR(MAX),
GuideLastName VARCHAR(MAX),
email VARCHAR(MAX),
group_id_text VARCHAR(MAX),
CandidateName VARCHAR(MAX),
grade_text VARCHAR(5),
dateofbirth DATE
)
Run Code Online (Sandbox Code Playgroud)
我的问题是在更改临时表后尝试更新列。我收到错误:
消息 207,级别 16,状态 1
无效的列名
代码:
declare @SQl1 nvarchar(max)
set @SQL1 ='
ALTER TABLE #tmpImportData
ADD group_id INT
ALTER TABLE #tmpImportData
ADD guide_id INT
ALTER TABLE #tmpImportData
ADD password_plain_text VARCHAR(500)
ALTER TABLE #tmpImportData
ADD guide_email VARCHAR(500)
ALTER TABLE #tmpImportData
ADD class_id INT'
exec sp_executesql @Sql1
UPDATE #tmpImportData
SET group_id = CAST(group_id_text AS INT)
UPDATE #tmpImportData
SET group_id = 0 …Run Code Online (Sandbox Code Playgroud) 背景:我正在使用非生产 SQL Server 来操作大型数据集并运行一些基本计算。我拥有的原始数据文件大约有 30M 行,缺少记录(不是 NULL;它们不存在,但由于超出我判断的原因,它们必须存在)。所以我基本上为所有应该在那里的行和列(总共 6 列)创建了一个“shell”表——这个表大约有 80M 行。
问题:我需要帮助的步骤是在 80M 行表的顶部覆盖原始 30M 行。(所有30M行根据三列的值在大表中都有匹配的记录,其余三列当前为空,需要用原始数据覆盖。)
我成功地为更大的数据集(40M/100M 表)完成了这个过程,这个过程大约需要 4 个小时。没关系 - 这是一次性的事情。但是当我在这个较小的数据集上运行它时,它运行了 10 多个小时。我第一次遇到超时错误。我试过调整一些东西并再运行两次,但我在大约 10 个小时后取消了查询,认为我可以尝试其他的东西。
关于为什么它第一次在更大的桌子上工作,而不是在这个较小的桌子上有什么想法?关于如何使代码更高效或清除某个文件中的某些内容的任何想法?
代码:
update [shelltable]
set shelltable.column4 = originaltable.column4,
shelltable.column5 = originaltable.column5,
shelltable.column6 = originaltable.column6
from shelltable left join original table
on shelltable.column1 = originaltable.column1 and
shelltable.column2 = originaltable.column2 and
shelltable.column3 = originaltable.column3;
Run Code Online (Sandbox Code Playgroud)
自从尝试失败以来我尝试过的事情:
我有一个大表(58+ 百万条记录),它表示第二个表中两条记录(玩家和目标)之间的关系。
不幸的是,设计我们模式的人并没有考虑周全,而是选择使用用户名来表示这种关系,而不是用户记录的数字 ID。随着事情的进展(就像他们通常所做的那样),我们的用户名不再是玩家的有效唯一表示,因此我需要将这些关系转换为使用数字 ID。
多亏了 Percona Toolkit,在不加锁的情况下添加字段很容易,它提供了 pt-online-schema-change 可以在实时表上进行 ALTER。但是,填充表格可能会更棘手。
表格看起来像这样(我已经剥离了不相关字段的创建),两个未填充的字段是player_id和target_id:
CREATE TABLE `player_targets` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`player` varchar(20) NOT NULL,
`player_id` int(10) unsigned DEFAULT NULL,
`target` varchar(20) NOT NULL,
`target_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=58000000 DEFAULT CHARSET=latin1;
CREATE TABLE 'player_uuids' (
`id`int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=600000 DEFAUL CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
我打算用这样的查询填充两个新字段:
UPDATE player_targets t
INNER JOIN player_uuids u1
ON …Run Code Online (Sandbox Code Playgroud) 我有两张桌子,products并且subscriptions:
CREATE TABLE products (
id bigint NOT NULL,
title character varying(75),
description text,
manufacturer_id bigint,
created_at timestamp without time zone,
updated_at timestamp without time zone,
mpn text,
visible boolean DEFAULT false NOT NULL
);
CREATE TABLE subscriptions (
id bigint NOT NULL,
product_id bigint NOT NULL,
user_id bigint NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
);
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我通常需要知道某个产品的订阅者数量,而在应用程序中所有正确位置使用此逻辑是很棘手的。所以我想products用已经包含该信息的视图替换该表。所以我这样做了:
ALTER TABLE ONLY products
RENAME TO products_raw;
CREATE VIEW products AS …Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL、Employee 和 Leave 中有两个表,如下所示:
CREATE TEMP TABLE employee_table AS SELECT
id::int,
name::text
FROM ( VALUES
(1, 'John' ),
(2, 'David')
) AS t(id, name);
CREATE TEMP TABLE leave_table AS SELECT
id::int,
leave_date::date,
emp_id::int
FROM ( VALUES
(1, '01/10/1993' ,1),
(2, Null ,1),
(3, Null ,1),
(4, '02/12/1990' ,2),
(5, Null ,2),
(6, Null ,2)
) AS t(ID,Leave_Date,Emp_ID);
Run Code Online (Sandbox Code Playgroud)
我想更新 Leave 表并将 Leave_Date 列设置为每个员工的随机日期,可能是 01/01/2000,但如果员工在 Leave 表中有多个空条目,我想用两个不同的日期更新他的空条目这意味着一名员工在休假表中不应有两个相同的 Leave_Date 值,更新后我的休假表应如下所示:
ID Leave_Date Emp_ID
1 01/10/1993 1
2 01/01/2000 1
3 01/01/2001 1 …Run Code Online (Sandbox Code Playgroud) 我创建了一个 varbinary 哈希来检查 2 个表之间的更改。
这是执行计划,我对索引有点困惑,或者确实有更好的编写方式。 https://www.brentozar.com/pastetheplan/?id=HkHmqoczm
连接中的 2 列是目标中的 PK,并且在源中具有非聚集索引。困扰我的一点是排序导致的 tempdb 溢出。
鉴于这种
declare @Data table (id int, fact char(1));
declare @Summary table (id int, collected varchar(99));
insert @Data(id, fact)
values
(1, 'a'),
(1, 'b'),
(2, 'c'),
(2, 'd'),
(2, 'e');
-- Form a list of unique id values
insert @Summary(id, collected) select distinct id, '' from @Data;
-- Accumulate the fact values into collected
update s
set collected = collected + d.fact
from @Summary as s
inner join @Data as d
on d.id = s.id;
select * from @Summary;
Run Code Online (Sandbox Code Playgroud)
我曾预料
id …Run Code Online (Sandbox Code Playgroud) 我先说这是来自 Stack Overflow 上一个未回答问题的交叉帖子。
我这样做并不是为了获得对这个问题的更多看法,我希望 DBA 社区分享他们对这是否可能是 SQL Server 中的错误的看法。我认为 SO 社区没有专业知识来决定这一点,所以我在这里重新发布。
假设我有一个 table T,并且我有一个索引视图V:
CREATE TABLE dbo.T (id int PRIMARY KEY, b bit NOT NULL, txt varchar(20));
GO
CREATE VIEW dbo.V
WITH SCHEMABINDING AS
SELECT T.Id, T.txt
FROM dbo.T AS T
WHERE T.b = 1;
GO
CREATE UNIQUE CLUSTERED INDEX idx_V ON dbo.V (Id);
Run Code Online (Sandbox Code Playgroud)
在这个简单的例子中,它基本上只是一个过滤索引,但它也可以有连接等。
我现在想在Twhere 中选择一些行,这里b = 1的过滤视图非常有用,我在标准上所以必须使用NOEXPAND(或者它对于视图匹配来说太复杂了):
SELECT Id, txt
FROM V WITH (NOEXPAND);
Run Code Online (Sandbox Code Playgroud)
这很好用。
现在我想将这些行更新为某个值。该视图符合可更新条件,因此我可以执行以下操作: …
我最近开始将个人项目从 Microsoft SQL Server 转换为 PostgreSQL,我对UPDATE JOIN在两个表之间执行时遇到的糟糕性能感到惊讶。
假设它们看起来像:
CREATE TABLE foo (
id INTEGER NOT NULL PRIMARY KEY,
bar INTEGER NULL
);
CREATE TABLE foo2 (
id INTEGER NOT NULL PRIMARY KEY,
bar INTEGER NULL
);
Run Code Online (Sandbox Code Playgroud)
在 T-SQL 中,我会使用这样的连接来进行更新:
UPDATE foo
SET bar = t2.bar
FROM foo t1
JOIN foo2 t2
ON t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)
但是在 Postgres 中运行,查询速度非常慢。
如果我将其更改为:
UPDATE foo
SET bar = t2.bar
FROM foo2 t2
WHERE foo.id = t2.id;
Run Code Online (Sandbox Code Playgroud)
这不是问题。
我知道语法是不同的,但我希望查询优化器能在同一个球场上解决一些问题。相反,事情变得疯狂。除了语法差异之外,我看不到的两个查询之间是否存在细微差别?
Update on foo …Run Code Online (Sandbox Code Playgroud) update ×10
sql-server ×6
postgresql ×3
join ×2
t-sql ×2
alter-table ×1
insert ×1
locking ×1
myisam ×1
mysql ×1
performance ×1
query ×1
trigger ×1
view ×1