任何人都能告诉我是否有相当于SCOPE_IDENTITY()
在SQL Server中使用GUID作为主键的时候?
我不想先创建GUID并保存为变量,因为我们使用顺序GUID作为主键.
有什么最好的方法来检索最后插入的GUID主键吗?
所以我有一个以标识列为主键的表,所以它是一个整数.那么,为什么SCOPE_IDENTITY()
总是向我的C#应用程序返回一个十进制值而不是一个int?这真的很烦人,因为十进制值不会隐式转换为C#中的整数,这意味着我现在必须重写一堆东西,并且有很多辅助方法,因为我使用SQL Server和Postgres,Postgres确实返回一个整数等效功能..
为什么SCOPE_IDENTITY()
不只返回一个普通的整数?是否有人通常使用十进制/非身份值作为主键?
我有一些SQL Server的原始SQL查询,它们使用SCOPE_IDENTITY在一次执行INSERT后立即检索特定INSERT的生成ID ...
INSERT into Batch(
BatchName,
BatchType,
Source,
Area
) Values (
@strBatchName,
@strType,
@strSource,
@intArea
);
SELECT SCOPE_IDENTITY() BatchID;
Run Code Online (Sandbox Code Playgroud)
问题是:
对Oracle数据库执行此操作的最佳方法是什么?
这可以通过标准SQL在Oracle上完成,还是我必须将其切换为使用存储过程并在存储过程的主体中放置类似的东西?
如果它必须是存储过程,那么检索最后生成的序列号的事实上的标准方法是什么,注意考虑在多个线程上可能存在重叠执行,因此该机制需要检索正确生成的ID和不一定是绝对最后生成的ID.
如果两个同时执行,则每个必须从每个相应的呼叫返回正确的生成ID.注意我没有使用SQL Server的"@@ IDENTITY",因为调用的多线程特性.
如果可能的话,我宁愿将其保留为原始SQL,因为我更容易跨平台管理(包含由DBMS识别标签分隔的每个平台的SQL块的单个文件).存储过程对我来说要管理的工作要多一点,但如果这是唯一可能的话,我可以这样做.
我将许多数据行从csv文件导入SQL Server数据库(通过Web应用程序).我需要为客户端返回自动生成的id值.
如果我在循环中执行此操作,性能非常糟糕(但我可以SCOPE_IDENTITY()
毫无问题地使用).
更高效的解决方案是这样的:
INSERT INTO [MyTable]
VALUES ('1'), ('2'), ('3')
SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
有没有办法获得所有生成的ID,而不仅仅是最后生成的ID?
谢谢你的帮助!
最好的问候,托尔斯滕
因此,Scope_Identity()在SQL Server中返回?-Byte数值类型.
那不是很棒.
有没有一种安全的方法将它转换为选择查询中的int,因此我们不必管理ODBC Wrapper中的每一个SQL Server的奇思妙想?
我将给出一个当前方法的伪代码示例,如果有人知道某个方法一次不能运行一行,我会非常感激.我正在使用MS SQL Server 2008.
define cursor for the data to be inserted (about 3 million records)
loop
(
insert record into table 1
use scope_identity() to get key
insert record into table 2 that references table 1
)
Run Code Online (Sandbox Code Playgroud)
我宁愿同时对两个表进行某种插入,因为游标和循环很慢.
在有人讨论为什么我在两个具有1对1关系的单独表中插入内容之前,这是因为第一个表无法修改,我需要第二个(临时)表中的信息以供稍后的数据转换操作参考.
不,我无法添加临时列来将参考数据保存到无法修改的表中,因为它无法修改.这是一个实时系统,我没有权限更改表.
谢谢!
附加信息:
防爆
Source:
1 a big monkey
2 a tall elephant
3 a big giraffe
4 a tiny cow
5 a tall cow
Dest:
Table 1 Table 2
monkey 1 big
elephant 2 tall
giraffe 3 big
cow …
Run Code Online (Sandbox Code Playgroud) 我有一个存储过程,除了其他功能之外,还有一些循环内不同表中的插入.请参阅以下示例以更清楚地了解:
INSERT INTO T1 VALUES ('something')
SET @MyID = Scope_Identity()
... some stuff go here
INSERT INTO T2 VALUES (@MyID, 'something else')
... The rest of the procedure
Run Code Online (Sandbox Code Playgroud)
这两个表(T1和T2)在每个表中都有一个IDENTITY(1,1)列,我们称之为ID1和ID2; 但是,在我们的生产数据库(非常繁忙的数据库)中运行该程序并在每个表中有超过6250条记录后,我注意到ID1与ID2不匹配的一个事件!虽然通常对于插入T1中的每个记录,但是在T2中插入了记录,并且两者中的标识列一致地递增.
"错误的"记录是这样的:
ID1 Col1
---- ---------
4709 data-4709
4710 data-4710
ID2 ID1 Col1
---- ---- ---------
4709 4710 data-4710
4710 4709 data-4709
Run Code Online (Sandbox Code Playgroud)
注意第二个表中的"倒"ID1.
在操作中对SQL Server知之甚少,我已经提出了以下"理论",也许有人可以纠正我.
我认为因为循环比物理写入表更快,和/或可能延迟写入过程的其他事情,记录被缓冲.在写它们的时候,它们没有特别的顺序写.
如果没有,那是否可能,如何解释上述情况?
如果是,那么我还有另一个问题要提出来.如果第一个插入(来自上面的代码)被延迟怎么办?这是不是意味着我不会将正确的IDENTITY插入第二个表?如果答案也是肯定的,那么我该怎样做才能确保两个表中的插入将按正确的IDENTITY顺序进行?
我感谢任何有助于我理解这一点的评论和信息.
提前致谢.
我有点陷入困境,为什么我似乎无法通过下面的语句获得插入行的"新标识".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) 我知道这个问题已经在这个网站上出现过很多次了,但是我的代码无法正常工作。
我有一个Insert
声明,我需要在我的 asp.net 页面上的那个声明中的 id。
我正在获取return value 0
.
public int newid { get; set; }
public void CreateAlbum(string _titel, string _name, string _thumb, int _userid)
{
objCMD = new SqlCommand(@"INSERT INTO tblFotoalbum
(fldAlbumHead, fldAlbumName, fldAlbumThumb, fldUserID_FK)
VALUES
(@titel, @name, @thumb, @userid);
SET @newid = SCOPE_IDENTITY()");
objCMD.Parameters.AddWithValue("@titel", _titel);
objCMD.Parameters.AddWithValue("@name", _name);
objCMD.Parameters.AddWithValue("@thumb", _thumb);
objCMD.Parameters.AddWithValue("@userid", _userid);
objCMD.Parameters.AddWithValue("@newid", newid);
objData.ModifyData(objCMD);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用SQL Server 2008 R2 Profiler调试ColdFusion 7应用程序上的问题 - 这是由其他人开发的 - 在Windows 7上运行,SQL Server 2008 R2作为后端.该应用程序最初使用MS Access 2003作为后端,后来转换为SQL Server 2008 R2.分析器显示以下使用SCOPE_IDENTITY()的SQL,但是当我使用搜索实用程序搜索应用程序根目录时,没有文件在其SQL查询中的任何位置使用SCOPE_IDENTITY()函数.该应用程序的SQL Server数据库没有任何存储过程,视图,函数等.所有SQL查询都是ColdFusion文件中的嵌入式查询.然后Profiler获得SCOPE_IDENTITY()函数:
declare @p1 int
set @p1=11
exec sp_prepexec @p1 output,N'@P1 datetimeoffset,@P2 varchar(8000),@P3 int,@P4 varchar(8000)',N'insert into ProductItems (item_date , item_description, item_type)
values (
@P1 ,
@P2 ,
@P3 ,
) select SCOPE_IDENTITY()','2015-10-19 00:00:00 +00:00','Test description',1
select @p1
Run Code Online (Sandbox Code Playgroud)
更新 虽然最初的应用程序是在CF 7中开发的,但CF 7后来升级到了CF9,现在我在具有CF 11的本地机器上进行调试.我不知道在更换CF 7时代码是否也升级了CF 8,然后是CF 9.在查询器中似乎生成上述SQL的CFquery看起来像.此外,表ProductItems确实有一个标识列,数据库没有使用任何触发器,CFquery标签没有使用结果属性:
<cfquery name="addProductItems" datasource="#dtsource#">
insert into Productitems (item_date,item_description,item_type)
values (
<cfqueryPARAM value = "#item_dat#" CFSQLType = "CF_SQL_TIMESTAMP" null="#item_dat …
Run Code Online (Sandbox Code Playgroud) sql-server coldfusion sql-server-profiler scope-identity sql-server-2008-r2
scope-identity ×10
sql-server ×8
sql ×3
c# ×2
.net ×1
asp.net ×1
bulkinsert ×1
coldfusion ×1
cursor ×1
foreign-keys ×1
guid ×1
identity ×1
insert ×1
oracle ×1
primary-key ×1
return-value ×1
spring.net ×1
t-sql ×1