我试图在INSERT声明后得到一个键值.示例:我有一个包含属性name和id的表.id是生成的值.
INSERT INTO table (name) VALUES('bob');
Run Code Online (Sandbox Code Playgroud)
现在我想在同一步骤中恢复身份.这是怎么做到的?
我们正在使用Microsoft SQL Server 2008.
我对以下模式的副作用和潜在问题很感兴趣:
CREATE PROCEDURE [Name]
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
[...Perform work, call nested procedures...]
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
END
Run Code Online (Sandbox Code Playgroud)
据我所知,当使用单个过程时,此模式是合理的 - 过程将完成所有语句而不会出错,或者它将回滚所有操作并报告错误.
但是,当一个存储过程调用另一个存储过程来执行某个子工作单元时(理解为较小的过程有时会单独调用),我看到与回滚有关的问题 - 一条信息性消息(级别16)发表声明The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION..我假设是因为子过程中的回滚总是回滚最外层事务,而不仅仅是子过程中启动的事务.
我确实希望整个事情回滚并在发生任何错误时中止(并且错误报告给客户端作为SQL错误),我只是不确定外层试图回滚事务的所有副作用已经回滚过了.也许@@TRANCOUNT在每个TRY CATCH层进行回滚之前检查一下?
最后是客户端(Linq2SQL),它有自己的事务层:
try
{
var context = new MyDataContext();
using (var transaction = new TransactionScope())
{
// Some Linq stuff
context.SubmitChanges();
context.MyStoredProcedure();
transactionComplete();
}
}
catch
{
// An …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚以下代码有什么问题,语法是正确的(使用SQL Management Studio检查),我有访问权限因为我应该也可以这样做..但是出于某种原因,我试图创建一个表通过PyODBC然后它停止工作.
import pyodbc
def SQL(QUERY, target = '...', DB = '...'):
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + target + DB+';UID=user;PWD=pass')
cursor = cnxn.cursor()
cursor.execute(QUERY)
cpn = []
for row in cursor:
cpn.append(row)
return cpn
print SQL("CREATE TABLE dbo.Approvals (ID SMALLINT NOT NULL IDENTITY PRIMARY KEY, HostName char(120));")
Run Code Online (Sandbox Code Playgroud)
它失败了:
Traceback (most recent call last):
File "test_sql.py", line 25, in <module>
print SQL("CREATE TABLE dbo.Approvals (ID SMALLINT NOT NULL IDENTITY PRIMARY KEY, HostName char(120));")
File "test_sql.py", line 20, in SQL
for …Run Code Online (Sandbox Code Playgroud) 我在Sql Server 2008数据库中创建存储过程.我想返回受影响的行数.哪个是更好的选择SET NOCOUNT OFF或RETURN @@ ROWCOUNT?
ALTER PROCEDURE [dbo].[MembersActivateAccount]
@MemberId uniqueidentifier
AS
BEGIN
-- Should I use this?
SET NOCOUNT OFF;
UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId;
--Or should I SET NOCOUNT ON and use the following line instead?
--return @@ROWCOUNT;
END
Run Code Online (Sandbox Code Playgroud)
我知道两者都有效,但这是一个更好的选择,为什么?
经过一番尝试后,我得出的结论是,在存储过程中,SET NOCOUNT默认为OFF.是否可以在我的数据库中更改此行为?
我正在使用nHibernate更新表中的2列,其中包含3个加密触发器.触发器不归我所有,我不能对它们进行更改,所以不幸的是我无法在它们内部设置NOCOUNT.
有没有其他方法可以解决在提交时抛出的TooManyRowsAffectedException?
到目前为止,我唯一能解决问题的方法就是绕过.Save例程
var query = session.CreateSQLQuery("update Orders set Notes = :Notes, Status = :Status where OrderId = :Order");
query.SetString("Notes", orderHeader.Notes);
query.SetString("Status", orderHeader.OrderStatus);
query.SetInt32("Order", orderHeader.OrderHeaderId);
query.ExecuteUpdate();
Run Code Online (Sandbox Code Playgroud)
它感觉很脏并且不容易伸展,但它没有陨石坑.
在本文中,作者建议存在与之相关的材料开销,SET NOCOUNT ON并且"通过从网络中删除这些额外开销,它可以极大地提高数据库和应用程序的整体性能"
作者引用了默认存储过程模板从2000到2005的更改,并建议"Microsoft甚至意识到问题",这促使此模板发生更改.
是否有人通过设置NOCOUNT ON来证明支持或驳斥声称的性能增益.
我有一个如下查询
declare @str_CustomerID int
Insert into IMDECONP38.[Customer].dbo.CustomerMaster
( CustomerName , CustomerAddress , CustomerEmail , CustomerPhone )
values ( ‘werw12e’ , ‘jkj12kj’ , ‘3212423sdf’ , ‘1212121?
)
select @str_CustomerID= scope_identity()
Run Code Online (Sandbox Code Playgroud)
执行后,它在我的参数中返回null.
我想获得身份的价值.我怎样才能做到这一点?
这里的主要问题是"IMDECONP38" - 我使用的服务器名称.如果我删除它,我可以在我的参数中获取身份的值.
我最近遇到了linq-to-sql的一些问题.问题是,当我们有一个附加到事件的触发器时,它"认为"它在插入和更新时失败.一个示例可以是一行,其中附加了一个触发器,以便在更改行时将"LastUpdated"冒号设置为当前时间.这将导致linq-to-sql认为在更新或插入时失败,但这只是有时候,因为它有时会通过,我认为这是当sql服务器负载很重的时候因此不能在进行验证之前执行触发器,这只是猜测.因为我的脚本只是一个更大的脚本的一部分,所以禁用触发器不是一个选项,所以我需要找到一个解决方案,或重写我的程序.您是否遇到过这个问题并找到了解决方案,例如在插入后禁用验证?
触发.
USE [cnhha]
GO
/****** Object: Trigger [dbo].[LastUpdated] Script Date: 05/12/2011 16:26:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[LastUpdated] ON [dbo].[CN_User]
FOR INSERT, UPDATE
AS
update cn_user set lastupdated=getdate() where campusnetuserid in (select campusnetuserid from inserted)
Run Code Online (Sandbox Code Playgroud) 这是我的存储过程.当我测试它时,总是得到正确的结果.
ALTER PROCEDURE [dbo].[AddSmoothieIngredients]
-- Add the parameters for the stored procedure here
@Query NVARCHAR(4000) ,
@SmoothieId INT ,
@CreatedDate DATETIME ,
@Status INT ,
@UserId INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRAN
IF @SmoothieId > 0
BEGIN
DELETE FROM dbo.SmoothieIngredients
WHERE SmoothieId = @SmoothieId;
EXECUTE (@Query);
END
ELSE
BEGIN
IF @UserId = 0
SET @UserId = NULL;
INSERT INTO dbo.Smoothie …Run Code Online (Sandbox Code Playgroud) 在其他人的帮助下,我今天早上敲了几张桌子和存储过程,因为我远离数据库程序员.
有人会介意盯着这个并告诉我它是否是线程安全的吗?我想这可能不是DBA/DB开发人员使用的术语,但我希望你能得到这个想法:基本上,如果这个sp正在执行而另一个同时出现会发生什么?一个人会干扰另一个吗?这甚至是SQL/SP中的一个问题吗?
CREATE PROCEDURE [dbo].[usp_NewTicketNumber]
@ticketNumber int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [TEST_Db42].[dbo].[TicketNumber]
([CreatedDateTime], [CreatedBy])
VALUES
(GETDATE(), SUSER_SNAME())
SELECT @ticketNumber = IDENT_CURRENT('[dbo].[TicketNumber]');
RETURN 0;
END
Run Code Online (Sandbox Code Playgroud) sql-server ×7
sql ×4
linq-to-sql ×2
t-sql ×2
dapper ×1
database ×1
identity ×1
nhibernate ×1
nocount ×1
performance ×1
pyodbc ×1
python ×1
rowcount ×1
transactions ×1
triggers ×1
windows ×1