我们有一个大型应用程序,主要用SQL Server 7.0编写,其中所有数据库调用都是存储过程.我们现在运行SQL Server 2005,它提供了更多的T-SQL功能.
在几乎所有SELECT,INSERT,UPDATE和DELETE之后,@@ ROWCOUNT和@@ ERROR被捕获到局部变量中并对问题进行评估.如果出现问题,则执行以下操作:
它们都不检查行(只有在知道的情况下),并且一些不同的日志/调试信息或多或少.此外,行逻辑是从错误逻辑拆分的某些时间(在更新中,在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) …
我使用的是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
计算具有大量数据的表可能非常慢,有时需要几分钟; 它还可能在繁忙的服务器上生成死锁.我想显示实际值,NOLOCK不是一个选项.
我使用的服务器是SQL Server 2005或2008 Standard或Enterprise - 如果重要的话.我可以想象SQL Server维护每个表的计数,如果没有WHERE子句,我可以很快得到这个数字,对吗?
例如:
SELECT COUNT(*) FROM myTable
Run Code Online (Sandbox Code Playgroud)
应立即返回正确的值.我是否需要依赖统计数据进行更新?
我有一个有几千行的表.描述和摘要字段是NTEXT,有时其中包含非ASCII字符.如何找到所有非ASCII字符的行?
我有触发器操作并将大量数据插入到更改跟踪表中,以便在每次插入,更新和删除时进行审计.
这个触发器很好地完成了它的工作,通过使用它,我们能够根据每个事务的业务需求记录所需的旧值/新值.
但是,在源表有很多列的某些情况下,事务完成最多可能需要30秒才能完成,这是不可接受的.
有没有办法使触发器异步运行?任何例子.
在Management Studio中,您可以右键单击表组以为表列表创建过滤器.有没有人想出一种在过滤器中包含多个表的方法?例如,我想要显示所有带" br_*"和" tbl_*"的表格.
有人知道怎么做吗?
症状:使用msdb.dbo.sp_send_dbmail发送附件会导致以下错误:
文件附件或查询结果大小超过允许值1000000字节
我怎样才能提高这个价值?
这是基于类似的问题如何替换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 server中的子查询中使用CTE?
喜欢 ..
选择id(我想在这里使用CTE),来自table_name的名称
sql t-sql sql-server sql-server-2005 common-table-expression
假设我有一个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分钟.没关系.没有转换成分钟的任何其他方式?
sql-server ×10
sql-server-2005 ×10
sql ×6
t-sql ×4
count ×1
dateadd ×1
datetime ×1
sql-function ×1
ssms ×1
triggers ×1