标签: t-sql

如何在sql server中重新抛出相同的异常

我想在我的try块中出现的sql server中重新抛出相同的异常.我可以抛出相同的消息,但我想抛出相同的错误.

BEGIN TRANSACTION
    BEGIN TRY
            INSERT INTO Tags.tblDomain 
            (DomainName, SubDomainId, DomainCode, Description)
            VALUES(@DomainName, @SubDomainId, @DomainCode, @Description)
            COMMIT TRANSACTION
    END TRY

    BEGIN CATCH
            declare @severity int; 
            declare @state int;

            select @severity=error_severity(), @state=error_state();

            RAISERROR(@@Error,@ErrorSeverity,@state);
            ROLLBACK TRANSACTION
    END CATCH
Run Code Online (Sandbox Code Playgroud)

RAISERROR(@@Error, @ErrorSeverity, @state);

这一行会显示错误,但我希望功能类似.这会引发错误,错误编号为50000,但我想要抛出错误的数字,我正在通过@@error,

我想在前端捕获此错误

catch (SqlException ex)
{
if ex.number==2627
MessageBox.show("Duplicate value cannot be inserted");
}
Run Code Online (Sandbox Code Playgroud)

我想要这个功能.使用raiseerror无法实现.我不想在后端给出自定义错误消息.

当我通过ErrorNo抛出catch时,RAISEERROR应该返回下面提到的错误

Msg 2627, Level 14, State 1, Procedure spOTest_DomainInsert,
Run Code Online (Sandbox Code Playgroud)

第14行违反UNIQUE KEY约束'UK_DomainCode'.无法在对象'Tags.tblDomain'中插入重复键.该语句已终止.

编辑:

如果我希望在前端处理异常,考虑到存储过程包含需要执行的多个查询,那么不使用try catch块的缺点是什么?

sql t-sql database sql-server exception-handling

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

如何获取多个列以用于游标循环?

当我尝试在游标循环中运行以下SQL代码段时,

set @cmd = N'exec sp_rename ' + @test + N',' +
           RIGHT(@test,LEN(@test)-3) + '_Pct' + N',''COLUMN'''
Run Code Online (Sandbox Code Playgroud)

我收到以下消息,

消息15248,级别11,状态1,过程sp_rename,行213
参数@objname不明确或声明@objtype(COLUMN)错误.

有什么问题,我该如何解决?我尝试用括号括起列名[],并""像一些建议的搜索结果一样加双引号.

编辑1 -

这是整个脚本.如何将表名传递给重命名sp?我不知道如何做到这一点,因为列名在许多表之一.

BEGIN TRANSACTION

declare @cnt int
declare @test nvarchar(128)
declare @cmd nvarchar(500) 
declare Tests cursor for
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE 'pct%' AND TABLE_NAME LIKE 'TestData%'

open Tests
fetch next from Tests into @test
while @@fetch_status = 0
BEGIN
  set @cmd = N'exec sp_rename ' + @test …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2005

79
推荐指数
1
解决办法
17万
查看次数

78
推荐指数
7
解决办法
19万
查看次数

MS SQL比较日期?

我有2个日期(日期时间):

date1 = 2010-12-31 15:13:48.593
date2 = 2010-12-31 00:00:00.000

它在同一天,只是不同的时间.比较date1和date2使用<=因为date1时间而无效.所以date1 <= date2是错误的,但应该是真的.我可以通过查看年,月和日来比较它们,以便它们是相同的吗?它的SQL Server 2008.

谢谢 :)

t-sql sql-server date sql-server-2008

78
推荐指数
2
解决办法
19万
查看次数

序列与身份

SQL Server 2012 Sequence作为新功能引入,与Oracle和Postgres相同.哪个序列优于身份?为什么我们需要序列?

sql t-sql sql-server sql-server-2012

78
推荐指数
4
解决办法
5万
查看次数

如何从T-SQL获取当前实例名称

如何使用T-SQL脚本获取当前连接的SQL Server服务器和实例名称?

sql t-sql sql-server sql-server-2008r2-express

78
推荐指数
5
解决办法
18万
查看次数

更新中的T-SQL字符串替换

我需要更新列的值,并在现有值上执行子字符串替换.

例:

数据包括abc@domain1,pqr@domain2等等.

我需要更新@domain2替换为的值@domain1.

t-sql string replace

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

在两个数据库之间添加外键关系

我在两个不同的数据库中有两个表.在table1中(在database1中)有一个名为column1的列,它是一个主键.现在在table2(在database2中)有一个名为column2的列,我想将它添加为外键.

我试图添加它,它给了我以下错误:

消息1763,级别16,状态0,行1
不支持跨数据库外键引用.外键Database2.table2.

消息1750,级别16,状态0,行1
无法创建约束.查看以前的错误.

我是如何做到这一点的,因为表位于不同的数据库中.

sql t-sql sql-server foreign-keys

77
推荐指数
4
解决办法
9万
查看次数

无法在表或索引视图上使用CONTAINS或FREETEXT谓词,因为它不是全文索引的

我在SQL Server 2008 R2数据库中收到以下错误:

不能在表或索引视图'tblArmy'上使用CONTAINSFREETEXT谓词,因为它不是全文索引的.

sql t-sql sql-server full-text-search sql-server-2008

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

如何从varchar中获取最后四个字符?

我正在尝试仅从varchar字段中获取最后四个字符.所有行都是不同的长度.我应该用什么功能来实现这个目标?

sql t-sql sql-server-2008

77
推荐指数
5
解决办法
23万
查看次数