相关疑难解决方法(0)

SQL Server - INSERT后的返回值

我试图在INSERT声明后得到一个键值.示例:我有一个包含属性name和id的表.id是生成的值.

    INSERT INTO table (name) VALUES('bob');
Run Code Online (Sandbox Code Playgroud)

现在我想在同一步骤中恢复身份.这是怎么做到的?

我们正在使用Microsoft SQL Server 2008.

sql sql-server sql-server-2008

279
推荐指数
8
解决办法
48万
查看次数

嵌套存储过程包含TRY CATCH ROLLBACK模式?

我对以下模式的副作用和潜在问题很感兴趣:

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)

stored-procedures transactions sql-server-2005 linq-to-sql

54
推荐指数
2
解决办法
3万
查看次数

MSSQL2008 - Pyodbc - 以前的SQL不是查询

我无法弄清楚以下代码有什么问题,语法是正确的(使用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)

python windows pyodbc sql-server-2008

27
推荐指数
5
解决办法
2万
查看次数

SET NOCOUNT OFF或RETURN @@ ROWCOUNT?

我在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.是否可以在我的数据库中更改此行为?

sql t-sql sql-server rowcount nocount

17
推荐指数
2
解决办法
3万
查看次数

带有加密触发器的TooManyRowsAffectedException

我正在使用nHibernate更新表中的2列,其中包含3个加密触发器.触发器不归我所有,我不能对它们进行更改,所以不幸的是我无法在它们内部设置NOCOUNT.

有没有其他方法可以解决在提交时抛出的TooManyRowsAffectedException?

更新1

到目前为止,我唯一能解决问题的方法就是绕过.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)

它感觉很脏并且不容易伸展,但它没有陨石坑.

sql-server nhibernate triggers

13
推荐指数
2
解决办法
3595
查看次数

SET NOCOUNT ON是否真的会产生很大的性能差异

本文中,作者建议存在与之相关的材料开销,SET NOCOUNT ON并且"通过从网络中删除这些额外开销,它可以极大地提高数据库和应用程序的整体性能"

作者引用了默认存储过程模板从2000到2005的更改,并建议"Microsoft甚至意识到问题",这促使此模板发生更改.

是否有人通过设置NOCOUNT ON来证明支持或驳斥声称的性能增益.

performance sql-server-2005

12
推荐指数
2
解决办法
6435
查看次数

SQL Server身份问题

我有一个如下查询

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" - 我使用的服务器名称.如果我删除它,我可以在我的参数中获取身份的值.

sql database sql-server identity sql-server-2005

11
推荐指数
2
解决办法
2788
查看次数

当这是附加的触发器时,Linq-to-sql在插入和更新时失败

我最近遇到了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)

sql-server linq-to-sql

11
推荐指数
1
解决办法
2369
查看次数

使用Dapper.net调用存储过程,总是返回-1

这是我的存储过程.当我测试它时,总是得到正确的结果.

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)

sql-server stored-procedures sql-server-2008 dapper

8
推荐指数
3
解决办法
2万
查看次数

这个存储过程是否是线程安全的?(或SQL Server上的等价物)

在其他人的帮助下,我今天早上敲了几张桌子和存储过程,因为我远离数据库程序员.

有人会介意盯着这个并告诉我它是否是线程安全的吗?我想这可能不是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 t-sql sql-server sql-server-2005 thread-safety

6
推荐指数
2
解决办法
7201
查看次数