我有这个表定义:
CREATE TABLE `media` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`brands_id` int(11) DEFAULT NULL,
`media_type` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`title` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`description` longtext COLLATE utf8_unicode_ci NOT NULL,
`thumbnail_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`media_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`media_code` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`inactive` tinyint(1) NOT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
`titleHtml` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`descriptionHtml` longtext COLLATE utf8_unicode_ci NOT NULL,
`useHtml` tinyint(1) NOT NULL,
PRIMARY KEY …Run Code Online (Sandbox Code Playgroud) 我正在构建一个程序,它以以下形式生成 T-SQL 查询:
DECLARE @In TABLE (Col CHAR(20))
INSERT INTO @In VALUES value1, value2... value1000
GO
INSERT INTO @In VALUES value1001, value1002...
Run Code Online (Sandbox Code Playgroud)
但第二条INSERT语句抛出错误:
消息 1087,级别 15,状态 2,第 1 行
必须声明表变量“@In”。
我究竟做错了什么?
让我解释 :
让我们假设我们有一个数据库“用户”:
ID Name Surname
===================
1 John Doe
2 Foo Bar
3 Foo Baz
Run Code Online (Sandbox Code Playgroud)
现在我想更改所有这三行。我将抛出以下插入:
INSERT INTO user (ID, Name, Surname) VALUES (1, 'John', 'Conor') ON DUPLICATE KEY UPDATE ID = 1, Name = 'John', Surname = 'Conor';
INSERT INTO user (ID, Name, Surname) VALUES (2, 'Foo', 'Bar') ON DUPLICATE KEY UPDATE ID = 2, Name = 'Foo', Surname = 'Bar';
INSERT INTO user (ID, Name, Surname) VALUES (3, 'Foo', 'Baz') ON DUPLICATE KEY UPDATE ID = 3, …Run Code Online (Sandbox Code Playgroud) 我有一个订单、收件人和项目表。
我想根据上一个查询的响应将数据插入到每个表中。
insert into recipient(name, address) values(name, address);
insert into orders(recipient_id, total_price, total_quantity) values(recipient_id, 2000, 20);
insert into items(order_id, item, price, quantity, total) values(order_id, item1, 230, 2, 260);
insert into items(order_id, item, price, quantity, total) values(order_id, item2, 500, 2, 1000);
Run Code Online (Sandbox Code Playgroud)
我想在单个 PostgreSQL 查询中执行此操作。
这是我尝试过的
insert into users (fullname, email, phone, address, status)
values ('Mine Essien', 'davidessienshare@gmail.com', '08167462431', 'Andela Epic tower Lagos')
returning id as recipient_id
)
new_order AS(
insert into orders(user_id, recipient_id, quantity, total_cost)
values(1, recipient_id, 5, 9500)
returning id …Run Code Online (Sandbox Code Playgroud) 考虑下表:
Id Hash
----------- ----------------------------------
1 0x31F777F0804D301936411E3ECD760859
2 0xD64A593F3E9ACC972158D522A4289EA0
(Id is an identity column)
Run Code Online (Sandbox Code Playgroud)
在该表中,我想合并以下数据集:
Hash
----------------------------------
0x31F777F0804D301936411E3ECD760859
0x31F777F0804D301936411E3ECD760859
0x0C5A65264F92A543E7AAA06375349C06
(Id is NOT present in the dataset)
Run Code Online (Sandbox Code Playgroud)
合并规则如下:
合并的结果应该使表格看起来像这样:
Id Hash
----------- ----------------------------------
1 0x31F777F0804D301936411E3ECD760859
3 0x31F777F0804D301936411E3ECD760859
4 0x0C5A65264F92A543E7AAA06375349C06
Run Code Online (Sandbox Code Playgroud)
编写查询以实现此操作的最有效方法是什么?仅供参考,为简洁起见,省略了其他列。
我的代码:
SET IDENTITY_INSERT SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn ON
INSERT INTO SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn
SELECT ColumnWithIdentity, OtherColumnWithoutIdentity, LastColumnInThisTable
FROM ALinkedServer.PrettyCoolDatabaseAsWell.StandardSchema.TableWithIdentityColumn
SET IDENTITY_INSERT SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn OFF
Run Code Online (Sandbox Code Playgroud)
错误:
消息 8101,级别 16,状态 1,第 4 行
表 'SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn' 中标识列的显式值只能在使用列列表且 IDENTITY_INSERT 为 ON 时指定。
是什么赋予了?
我想在我的应用程序的“SystemSettings”表中添加一条记录,并使用 UPDATE 中的值设置 PK 值。PK 值来自“TS_LASTIDS”表,其中包含此应用程序 (MicroFocus SBM) 中每个表的最大 PK 值。我需要增加该表中的“TS_LASTID”列,并在将新记录插入“SystemSettings”表时使用新值作为 PK。
Insert Into
ts_SystemSettings ( ts_Id, ts_Name, ts_LongValue)
Values (
( -- ******************** This subquery updates the PK in TS_LASTIDS and outputs the new value
Update
ts_LastIds
Set
ts_LastId=ts_LastId+1
Output
INSERTED.ts_LastId
Where
ts_Name = 'SystemSettings'
) , -- ********************
'NSLastChangeId' ,
1 ,
) ;
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚语法。这是 MS SQL Server 2012。
我特意创建了这个例子来代表我的问题。
我创建了这样的表:
CREATE TABLE a
(
id INT
)
Run Code Online (Sandbox Code Playgroud)
然后我像这样创建了 2 个AFTER TRIGGER:
CREATE TRIGGER insert_a
ON a AFTER INSERT
AS
BEGIN
INSERT INTO a VALUES (1)
END
GO
CREATE TRIGGER insert_a2
ON a AFTER INSERT
AS
BEGIN
INSERT INTO a VALUES(2)
END
GO
Run Code Online (Sandbox Code Playgroud)
之后我插入到表中:
INSERT INTO a VALUES (0)
Run Code Online (Sandbox Code Playgroud)
我得到了结果:
消息 217,级别 16,状态 1,过程 insert_a2,第 5 行 [批处理起始行 0]。
超出最大存储过程、函数、触发器或视图嵌套级别(限制为 32)。
我认为这里存在周期性情况。触发器内部的插入,一次又一次地触发触发器。那会发生吗?
我想知道里面发生了什么?
有没有办法解决这个问题,但仍然保持完整的 2 AFTER INSERT触发器?
疯狂的情况。
我在 sql server 2016
select @@version
Run Code Online (Sandbox Code Playgroud)
Microsoft SQL Server 2016 (SP2-CU15) (KB4577775) - 13.0.5850.14 (X64) Sep 17 2020 22:12:45 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows Server 2012 R2 上的基于内核的许可(64 位)数据中心 6.3(内部版本 9600:)(管理程序)
在 sql server 中的一个简单插入语句中,我有关键字 values
例如:
BEGIN TRANSACTION T1
SELECT @@TRANCOUNT
INSERT INTO [APCore].[usr].[userBusinessArea]
([businessAreaID]
,[userID])
VALUES
(21, 368),
(21, 227419) ,
(21, 99906),
(21, 140470)
SELECT [1]= @@TRANCOUNT
--COMMIT TRANSACTION T1
--ROLLBACK
SELECT [2]=@@TRANCOUNT
Run Code Online (Sandbox Code Playgroud)
问题是,在我运行插入之前,我想使用与 相同的逻辑values来找出这些记录中是否已经有任何记录在表中。
否则你可能会得到这样的结果:
我的做法是:
select top 10 * from
[APCore].[usr].[userBusinessArea]
where …Run Code Online (Sandbox Code Playgroud) 假设我有一个包含以下数据的表:
Name | Things
-------------
Foo | 5
Bar | 3
Baz | 8
Run Code Online (Sandbox Code Playgroud)
如果我想插入一行,那么表的最终状态是:
Name | Things
-------------
Foo | 5
Qux | 6
Bar | 3
Baz | 8
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我知道我们通常不依赖表中行的顺序,但我继承了一些代码来做到这一点。如果我可以插入到一个位置,我就可以避免重大的重构。