相关疑难解决方法(0)

插入具有自动增量Id的表时保持外键关系

我有两个表:缺陷和缺陷数据.每个缺陷可能有也可能没有一个或多个缺陷数据.因此,DefectData将DefectId列作为外键.

两个表中的Id都是自动递增的标识.

我遇到的问题是,当我想插入一个新的缺陷及其缺陷数据时,首先插入缺陷并获取一个Id,但我不知道该ID是给DefectData的.我的解决方案是从匹配插入数据的缺陷中选择以获得Id.

  1. 插入缺陷
  2. 获取该缺陷的ID
  3. 插入DefectData(零或多个),ID为2.

设置IdentityInsert然后插入我自己的Id将无法工作,因为这是由网络服务器运行,可能有并发呼叫(我在这里吗?).

图

提前致谢.

sql insert foreign-key-relationship identity-column sql-server-2008

4
推荐指数
1
解决办法
2013
查看次数

TSQL在存储过程中的互斥访问

多个Web服务器访问SQL Server以获取数字代码,当此代码不存在时,它必须由SQL Server自动生成.

我需要确保即使两个并发调用进入并且代码不存在,也只创建一个代码,并且两个调用都返回相同的代码.所以我必须做这样的事情:

begin lock
  if code exists
    return code
  else
    generate code
    return code
end lock
Run Code Online (Sandbox Code Playgroud)

我一直在阅读关于隔离级别和表锁定的一些内容,但我对这一切都很糟糕.首先,我认为SERIALIZABLE隔离级别是我需要的,但显然它不是.

那么,你将如何在TSQL中实现"锁定"?

非常感谢.

更新:

当我尝试使用示例设置可序列化级别时出现此错误:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE get_code 
AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    GO
    BEGIN TRANSACTION

    select code from codes where granted is null;
END
GO
Run Code Online (Sandbox Code Playgroud)

消息1018,级别15,状态1,过程get_code,第4行'SERIALIZABLE'附近的语法不正确.如果这是作为表提示的一部分,则现在需要A WITH关键字和括号.有关正确的语法,请参阅SQL Server联机丛书.消息102,级别15,状态1,行5'END'附近的语法不正确.

这是什么意思?

sql-server multithreading synchronization locking sql-server-2005

3
推荐指数
1
解决办法
6129
查看次数

IF,RAISERROR&RETURN in Stored Procedure

我有一个存储过程PROC,它接收一些参数.如果其中一个@ID不是null PROC_A,则必须执行给定的存储过程.否则,PROC_B必须执行.问题是它们都可以发出一个RAISERROR,我希望通过调用堆栈传播,以便在客户端应用程序中显示.但是,这RAISERROR不会停止PROC存储过程的其余部分,因为我使用的是IF子句,因此检查IF ( @@ERROR <> 0 ) RETURN也不是一种选择.我唯一的选择似乎是使用一个TRY...CATCH块来包装IF子句并RAISERRORCATCH块中重新抛出from ,这很麻烦因为那时我将不得不缓存ERROR_MESSAGE(),ERROR_SEVERITY()并 再次ERROR_STATE()使用RAISERROR.

真的没有更优雅的方式吗?

stored-procedures sql-server-2005 return raiserror

3
推荐指数
1
解决办法
6380
查看次数

我应该拨打什么订单@@ ROWCOUNT/@@ ERROR

我使用INSERT和SELECT在表中插入一个或多个行.在事务之后,我想将@@ ROWCOUNT和@@ ERROR值存储到locallay声明的变量中.

INSERT SubscriberList (PublicationId, SubscriberId)
SELECT @PublicationId, S.SubscriberId
FROM Subscribers S

SET @NoRows = @@ROWCOUNT
SET @ErrorCode = @@ERROR
Run Code Online (Sandbox Code Playgroud)

如果我打电话给我,我不确定这是否有效,我会否定另一个吗?

sql t-sql

2
推荐指数
1
解决办法
1211
查看次数

如何使用RAISERROR抛出消息并提交事务?

我需要使用RAISERROR来抛出一条消息(弹出消息)并提交该事务.有什么选择吗?

对于严重性18,事务得到了回滚.我已将严重性更改为10并尝试了

RAISERROR('Your Reference Number is %s',10,0,@param); 
Run Code Online (Sandbox Code Playgroud)

这但它提交了交易,但没有显示消息.我需要的是必须抛出消息并且必须提交事务

有什么建议吗?

sql raiserror sql-server-2008

-3
推荐指数
2
解决办法
6424
查看次数