标签: sql-server-2005

SQL Server T-SQL错误处理的最佳实践使用是什么?

我们有一个大型应用程序,主要用SQL Server 7.0编写,其中所有数据库调用都是存储过程.我们现在运行SQL Server 2005,它提供了更多的T-SQL功能.

在几乎所有SELECT,INSERT,UPDATE和DELETE之后,@@ ROWCOUNT和@@ ERROR被捕获到局部变量中并对问题进行评估.如果出现问题,则执行以下操作:

  • 错误消息输出参数已设置
  • 回滚(如有必要)完成
  • info被写入(INSERT)到日志表
  • 返回错误编号,此程序是唯一的(如果是致命的,则是肯定的,否定是警告)

它们都不检查行(只有在知道的情况下),并且一些不同的日志/调试信息或多或少.此外,行逻辑是从错误逻辑拆分的某些时间(在更新中,在WHERE子句中检查并发字段,行= 0表示其他人已更新数据).但是,这是一个相当通用的例子:

SELECT, INSERT, UPDATE, or DELETE

SELECT @Error=@@ERROR, @Rows=@@ROWCOUNT
IF @Rows!=1 OR @Error!=0
BEGIN
    SET @ErrorMsg='ERROR 20, ' + ISNULL(OBJECT_NAME(@@PROCID), 'unknown') 
                               + ' - unable to ???????? the ????.'
    IF @@TRANCOUNT >0
    BEGIN 
        ROLLBACK
    END

    SET @LogInfo=ISNULL(@LogInfo,'')+'; '+ISNULL(@ErrorMsg,'')+
        + ' @YYYYY='        +dbo.FormatString(@YYYYY)
        +', @XXXXX='        +dbo.FormatString(@XXXXX)
        +', Error='         +dbo.FormatString(@Error)
        +', Rows='          +dbo.FormatString(@Rows)

    INSERT INTO MyLogTable (...,Message) VALUES (....,@LogInfo)

    RETURN 20

END
Run Code Online (Sandbox Code Playgroud)

我正在考虑用TRY-CATCH T-SQL替换我们如何做到这一点.我已经阅读了TRY ... CATCH(Transact-SQL) …

t-sql sql-server error-handling sql-server-2005

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

关键字'with'... previous语句附近的语法不正确必须以分号结束

我使用的是SQL Server 2005.我的存储过程中有2个WITH子句

WITH SomeClause1 AS
(
  SELECT ....
)
WITH SomeClause2 AS
(
  SELECT ....
)
Run Code Online (Sandbox Code Playgroud)

但是错误发生了

关键字'with'附近的语法不正确.如果此语句是公用表表达式或xmlnamespaces子句,则必须以分号结束前一个语句.

我有什么选择?有什么分配器我不知道吗?

sql t-sql sql-server sql-server-2005 common-table-expression

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

SQL Server计数很慢

计算具有大量数据的表可能非常慢,有时需要几分钟; 它还可能在繁忙的服务器上生成死锁.我想显示实际值,NOLOCK不是一个选项.

我使用的服务器是SQL Server 2005或2008 Standard或Enterprise - 如果重要的话.我可以想象SQL Server维护每个表的计数,如果没有WHERE子句,我可以很快得到这个数字,对吗?

例如:

SELECT COUNT(*) FROM myTable
Run Code Online (Sandbox Code Playgroud)

应立即返回正确的值.我是否需要依赖统计数据进行更新?

sql sql-server sql-server-2005 count sql-server-2008

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

如何在SQL Server 2005表的NTEXT字段中找到Unicode /非ASCII字符?

我有一个有几千行的表.描述和摘要字段是NTEXT,有时其中包含非ASCII字符.如何找到所有非ASCII字符的行?

sql sql-server sql-server-2005

34
推荐指数
3
解决办法
6万
查看次数

SQL Server 2005/2008中的异步触发器

我有触发器操作并将大量数据插入到更改跟踪表中,以便在每次插入,更新和删除时进行审计.

这个触发器很好地完成了它的工作,通过使用它,我们能够根据每个事务的业务需求记录所需的旧值/新值.

但是,在源表有很多列的某些情况下,事务完成最多可能需要30秒才能完成,这是不可接受的.

有没有办法使触发器异步运行?任何例子.

sql sql-server triggers sql-server-2005

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

SQL Server Management Studio - 在表列表中使用多个过滤器?

在Management Studio中,您可以右键单击表组以为表列表创建过滤器.有没有人想出一种在过滤器中包含多个表的方法?例如,我想要显示所有带" br_*"和" tbl_*"的表格.

有人知道怎么做吗?

sql-server ssms sql-server-2005 sql-server-2008

34
推荐指数
3
解决办法
4万
查看次数

如何在Microsoft SQL Server 2005/2008中增加使用msdb.dbo.sp_send_dbmail发送的电子邮件的最大允许附件大小

症状:使用msdb.dbo.sp_send_dbmail发送附件会导致以下错误:

文件附件或查询结果大小超过允许值1000000字节

我怎样才能提高这个价值?

sql-server sql-server-2005 sql-server-2008

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

如何在SQL中替换多个字符?

这是基于类似的问题如何替换Access SQL中的多个字符?

我写了这个,因为sql server 2005似乎对where子句中的19个替换的replace()函数有限制.

我有以下任务:需要在列上执行匹配,并使用replace()函数提高匹配剥离多个不需要的字符的机会

DECLARE @es NVarChar(1) SET @es = ''
DECLARE @p0 NVarChar(1) SET @p0 = '!'
DECLARE @p1 NVarChar(1) SET @p1 = '@'
---etc...

SELECT *
FROM t1,t2 
WHERE  REPLACE(REPLACE(t1.stringkey,@p0, @es), @p1, @es) 
     = REPLACE(REPLACE(t2.stringkey,@p0, @es), @p1, @es)    
---etc 
Run Code Online (Sandbox Code Playgroud)

如果where子句中有> 19 REPLACE(),则它不起作用.所以我想出的解决方案是在这个例子中创建一个名为trimChars的sql函数(请原谅他们从@ 22开始

CREATE FUNCTION [trimChars] (
   @string varchar(max)
) 

RETURNS varchar(max) 
AS
BEGIN

DECLARE @es NVarChar(1) SET @es = ''
DECLARE @p22 NVarChar(1) SET @p22 = '^'
DECLARE @p23 NVarChar(1) SET @p23 …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2005 sql-function

34
推荐指数
4
解决办法
15万
查看次数

我们如何在sql server中的子查询中使用CTE?

我们如何在sql server中的子查询中使用CTE?

喜欢 ..

选择id(我想在这里使用CTE),来自table_name的名称

sql t-sql sql-server sql-server-2005 common-table-expression

34
推荐指数
2
解决办法
4万
查看次数

从SQL Server 2005中的DateTime减去分钟

假设我有一个datetime字段,其值为2000-01-01 08:30:00 ,持续时间字段的值为00:15(表示15分钟)

如果我减去这两个,我应该得到2000-01-01 08:15:00

此外,如果我想减去1:15(意味着1小时15分钟),输出应该是2000-01-01 07:15:00

我在尝试 SELECT DATEDIFF(minute, '00:15','2000-01-01 08:30:00');

但输出是52595055.我怎样才能得到理想的结果?

NB~如果我这样做SELECT dateadd(minute, -15,'2000-01-01 08:30:00');,我将获得所需的结果,但这涉及解析分钟字段.

编辑:

根据答案,每个人都建议将所有内容转换为分钟然后减去 - 所以如果是1:30,我需要减去90分钟.没关系.没有转换成分钟的任何其他方式?

t-sql sql-server datetime sql-server-2005 dateadd

34
推荐指数
2
解决办法
9万
查看次数