我已经看到在插入后检索主键标识字段的值时使用的各种方法.
declare @t table (
id int identity primary key,
somecol datetime default getdate()
)
insert into @t
default values
select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1
Run Code Online (Sandbox Code Playgroud)
在插入后返回标识表:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
Run Code Online (Sandbox Code Playgroud)
什么方法适当或更好?OUTPUT方法是否范围安全?
Microsoft 的 OUTPUT Clause 文档表示您可以在 OUTPUT 子句的列名中使用from_table_name 。
有两个例子:
是否也可以在INSERT 语句中使用它?
INSERT INTO T ( [Name] )
OUTPUT S.Code, inserted.Id INTO @TMP -- The multi-part identifier "S.Code" could not be bound.
SELECT [Name] FROM S;
Run Code Online (Sandbox Code Playgroud)
-- A table to insert into.
DECLARE @Item TABLE (
[Id] [int] IDENTITY(1,1),
[Name] varchar(100)
);
-- A table variable to store inserted Ids …Run Code Online (Sandbox Code Playgroud) 我试图在存储过程中使用OUTPUT子句将一个indentity列的值输出到临时表.INSERT
CREATE TABLE #Test
(
ID INT
)
INSERT INTO [TableB] OUTPUT INSERTED.ID #Test SELECT * FROM [TableA]
Run Code Online (Sandbox Code Playgroud)
但是,当我执行此过程时,SQL Server向我显示调用的表(正确)中的结果,Test但如果我将其写SELECT * FROM #Test为存储过程中的下一个语句,则它不显示任何内容.我怎样才能有效地完成这项工作?
我有点陷入困境,为什么我似乎无法通过下面的语句获得插入行的"新标识".SCOPE_IDENTITY()只返回null.
declare @WorkRequestQueueID int
declare @LastException nvarchar(MAX)
set @WorkRequestQueueID = 1
set @LastException = 'test'
set nocount off
DELETE dbo.WorkRequestQueue
OUTPUT
DELETED.MessageEnvelope,
DELETED.Attempts,
@LastException,
GetUtcdate(), -- WorkItemPoisened datetime
DELETED.WorkItemReceived_UTC
INTO dbo.FaildMessages
FROM dbo.WorkRequestQueue
WHERE
WorkRequestQueue.ID = @WorkRequestQueueID
IF @@ROWCOUNT = 0
RAISERROR ('Record not found', 16, 1)
SELECT Cast(SCOPE_IDENTITY() as int)
Run Code Online (Sandbox Code Playgroud)
任何援助都将非常感激.
现在我使用这样的解决方法.
declare @WorkRequestQueueID int
declare @LastException nvarchar(MAX)
set @WorkRequestQueueID = 7
set @LastException = 'test'
set nocount on
set xact_abort on
DECLARE @Failed TABLE
(
MessageEnvelope …Run Code Online (Sandbox Code Playgroud) 我有两张桌子,Table_1和Table_2.
Table_1有列PK(自动增量int)和Value(nchar(10)).
Table_2has FK(int),Key(nchar(10))和Value(nchar(10)).
也就是说,Table_1是一个数据表,并且Table_2是一个键值存储,其中一行Table_1可以对应于0,1个或更多个键和值Table_2.
我想编写一个代码,以编程方式构建一个查询,该查询将一行插入到Table_1可变行数中,并Table_2使用主键Table_1.
我可以用一行轻松完成:
INSERT INTO Table_1 ([Value])
OUTPUT INSERTED.PK, 'Test1Key', 'Test1Val' INTO Table_2 (FK, [Key], [Value])
VALUES ('Test')
Run Code Online (Sandbox Code Playgroud)
但SQL似乎不喜欢有多行的想法.这失败了:
INSERT INTO Table_1 ([Value])
OUTPUT INSERTED.PK, 'Test1Key', 'Test1Val' INTO Table_2 (FK, [Key], [Value])
OUTPUT INSERTED.PK, 'Test2Key', 'Test2Val' INTO …Run Code Online (Sandbox Code Playgroud) 我有一个包含两列的表:
CREATE TABLE MyTable(
Id int IDENTITY(1,1) NOT NULL,
Name nvarchar(100) NOT NULL);
Run Code Online (Sandbox Code Playgroud)
我想使用 SELECT INSERT 语句复制数据:
INSERT INTO MyTable (Name)
SELECT Name FROM MyTable
Run Code Online (Sandbox Code Playgroud)
这是棘手的部分 - 我想检索原始身份和新身份之间的映射表:
DECLARE @idsMap TABLE (OriginalId int, NewId int)
Run Code Online (Sandbox Code Playgroud)
我知道我应该使用OUTPUT 子句,但由于某种原因它不起作用:
INSERT INTO MyTable (Name)
OUTPUT t.Id, INSERTED.Id INTO @idsMap (OriginalId, NewId)
SELECT Name FROM MyTable t
-- Returns error The multi-part identifier "t.Id" could not be bound.
Run Code Online (Sandbox Code Playgroud)
我正在运行我目前正在处理的存储过程中可怕的"多部分标识符无法绑定"错误.关于下面的查询,我有几个问题.
.
DECLARE @Results Table(
[FloorPlanId] UNIQUEIDENTIFIER,
[ImportFundingDateTime] DATETIME,
[TimeStamp] VARBINARY(8),
[BusinessId] UNIQUEIDENTIFIER
)
UPDATE CacRecord
SET MatchFound = 1
OUTPUT fp.[FloorplanId], cr.[ImportFundingDateTime],
fp.[TimeStamp], buyer.[BusinessId]
INTO @Results( [FloorplanId], [ImportFundingDateTime],
[TimeStamp], [BusinessId])
FROM CacRecord cr WITH (NOLOCK)
INNER JOIN CacBatch cb WITH (NOLOCK)
ON cr.CacBatchId = cb.CacBatchId
INNER JOIN Floorplan fp WITH (NOLOCK)
ON fp.UnitVIN = cr.ImportVin
AND COALESCE(fp.UnitVIN, '') <> ''
INNER JOIN Business buyer WITH (NOLOCK)
ON buyer.BusinessId = fp.BuyerBusinessId
LEFT OUTER JOIN BusinessContact bc WITH …Run Code Online (Sandbox Code Playgroud) 目前,我正在尝试update在SQL Server中执行(但它可能是任何支持该子句的DML语句),并且我想将输出放入本地临时表中,如下所示:output
update
dbo.MyTable
set
MyField = 30
output
inserted.MyKeyField
into
#myTempTable
from
dbo.MyTable as t
where
f.MyFilteredField = 8
Run Code Online (Sandbox Code Playgroud)
我知道语法是正确的,根据output条款的文档(强调我的):
output_table
指定将返回的行插入的表,而不是返回给调用者.output_table可以是临时表.
这就是说,我希望它的工作就像它会在该into条款上select,它只会创建表的语句.
但是,我收到以下错误:
无效的对象名称'#myTempTable'.
如何将output子句(inserted或deleted)的结果导入临时表?
在我们的数据库中,大多数表都有一个dbupddate字段指示datetime最后一个INSERT或UPDATE应用于该行。
为了避免该字段具有错误的值,存在触发器(有时AFTER,有时INSTEAD OF)来确保最终该值是正确的,而不是有人尝试写入该字段的任何“手动”其他值。
现在我正在执行更新语句(实际上MERGE),并且我想要一个OUTPUT包含该字段的子句。正如我在相应的 MS 文章中读到的,OUTPUT忽略触发器。
是否有任何解决方法可以返回触发器后的OUTPUT值?dbupddate我不想进行另一个查询来绘制信息,因为我不能保证在这些查询之间的瞬间,另一个用户的第三个查询可能不会改变所有内容。
遵循 Larnu 的建议后的结果
我运行了提供的示例,唯一的例外是将字段default的值更改updatetime为,convert(datetime2,'1900-01-01')以便我可能有意义。我运行了 4 个查询中的每一个,然后从各自的表中进行选择并比较了值updatetime:
INSERT INTO dbo.Sample1 (Someint)
OUTPUT inserted.*
INTO @inserted
SELECT 1;
SELECT 'Sample1 INSERT',*
FROM @inserted; -- 1900-01-01 00:00:00.000000
select * from Sample1 -- 2018-11-05 13:12:13.141580
Run Code Online (Sandbox Code Playgroud)
我猜这里的输出会忽略触发器并返回after触发器生效之前插入的默认值。
DECLARE @inserted table (ID int, Someint int, …Run Code Online (Sandbox Code Playgroud) 我正在攻读MCTS 70-433"数据库设计"证书,在我正在研究的文本中,其中一个自测有这个问题.
您有一个名为Get_NewProducts的存储过程.您希望将此存储过程的结果插入到Production.Product表中,并使用OUTPUT子句输出INSERTED.*值.做这个的最好方式是什么?
有四种可能的答案.前三个选项是" INSERT ... OUTPUT ... EXECUTE Get_NewProducts "语句的所有变体.第四个选择D简单地说"将存储过程重写为表值函数".
D是正确的答案.我不太明白为什么,文中没有任何内容可以解释它.有人有任何见解吗?
t-sql sql-server stored-procedures sql-server-2008 output-clause
我想知道在某个DELETE操作中删除了多少行.
我把微软例B是
DELETE Sales.ShoppingCartItem
OUTPUT DELETED.*
WHERE ShoppingCartID = 20621;
Run Code Online (Sandbox Code Playgroud)
并尝试修改它只返回count已删除的记录:
DELETE FROM datacache
OUTPUT COUNT(DELETED.*)
WHERE userId=@id
Run Code Online (Sandbox Code Playgroud)
但这引发了
ExceptionMessage: "Incorrect syntax near '*'."
ExceptionType: "System.Data.SqlClient.SqlException"
Message: "Error"
Run Code Online (Sandbox Code Playgroud)
所以我试过了
DELETE FROM datacache
OUTPUT COUNT(DELETED)
WHERE userId=@id
Run Code Online (Sandbox Code Playgroud)
哪个扔了
ExceptionMessage: "Invalid column name 'DELETED'."
ExceptionType: "System.Data.SqlClient.SqlException"
Message: "Error"
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
向下滚动到OUTPUT部分.它给了我一个红色的下划线.我想在InsertedCreditDebitAdjustmentIDs表格中插入@CreditDebitAdjustment与InvoiceNum一起插入的ID .我该怎么做呢?
DECLARE @InsertedCreditDebitAdjustmentIDs TABLE
(
ID INT,
InvoiceNumber VARCHAR(50)
)
INSERT INTO @CreditDebitAdjustment ( col1, col2, ...)
SELECT @ImportedFileID AS '@ImportedFileID',
tbl.col.value('(Purpose/text())[1]', 'VARCHAR(500)') AS Purpose,
etc.
FROM @XML.nodes('/CreditDebitAdjustments/CreditDebitAdjustment') AS tbl (col)
OUTPUT INSERTED.CreditDebitAdjustmentID, etc. INTO @InsertedCreditDebitAdjustmentIDs
Run Code Online (Sandbox Code Playgroud)