SqlServer_SQLServer2005存储过程概述;

2024-05-31 19:38

本文主要是介绍SqlServer_SQLServer2005存储过程概述;,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SQL Server 2005 存储过程
出处:http://www.cnblogs.com/qwertWZ/archive/2013/04/22/3036829.html;请支持原版;
摘自:《SQL Server 2005 编程入门经典》 第12章;

存储过程:存储过程(stored procedure)有时也称为sproc。存储过程存储于数据库中而不是在单独的文件中,有输入参数、输出参数以及返回值等。

12.1 创建存储过程:基本语法
>说明:在数据库中,创建存储过程和创建其他对象的过程一样,除它使用AS关键字外;
>基本语法:
CREATE PROCEDUER|PROC <sproc name>
    [
        <parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]]
        [
            ,<parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]]
        ]
        [,...]
    ]
[WITH
    RECOMPILE|ENCRYPTION|[EXECUTE AS {CALLER|SELF|OWNER|<'user name'>}]
[FOR REPLICATION]
AS
    <code>|EXTERNAL NAME <assembly name>.<assembly class>
>基本示例
/*创建*/
USE dbName
G
CREATE PROC spName
AS
    SELECT * FROM tablename;
/*执行*/
exec spName;

12.2 使用ALTER改变存储过程
>注意:当使用T-SQL编辑存储过程的时候,需要记住的是它完全取代了现存的存储过程;
>使用ALTER PROC和CREATE PROC的区别在于: ALTER PROC期望找到现存的存储过程,而CREATE则不是;ALTER PROC保留已经建立的存储过程的任何权限,它在系统对象中保留相同的对象ID并允许保留依赖关系;ALTER PROC在其他对象上保留任何依赖关系的信息,这些对象可以调用修改的存储过程;切记,如果执行DROP,然后使用CREATE,这和使用ALTER PROC语句一样,几乎都能得到相同的效果,除了一个很重要的区别——如果使用DROP和CREATE,则需要完全重新建立权限,权限规定了可以使用以及不能使用存储过程的用户;

12.3 删除存储过程
DROP PROC|PROCEDURE <sproc name>;

12.4 参数化(Parameterization)
1、声明参数
>说明:声明参数需要以下2到4部分信息: 名称、数据类型、默认值、方向;
>语法:
@parameter_name [AS] datatype[= default|NULL] [VARYING] [OUTPUT|OUT];名称有一个简单的规则集合,首先,它必须以@开始,此外,命名规则除了不能有嵌套的空格外,它和SQL的命令规则是相同的;数据类型可以使用SQL Server内置的或用户自定义的类型;切记,声明CURSOR类型参数的时候,必须也使用VARYING和OUTPUT选项;OUTPUT可以简写为OUT;
>示例:
//创建
USE Northwind
GO
CREATE PROC spInsertShippers
    @CompanyName NVARCHAR(40),
    @Phone NVARCHAR(24)
AS
    INSERT INTO Shippers VALUES(@CompanyName, @Phone);
// 执行
EXEC spInsertShippers 'Speedy Shippers, Inc.', '(503)555-5566';
切记,因为并没有为任何参数提供默认值,所以需要提供两个参数;这意味着为了成功运行该存储过程,则必须提供两个参数;
2、为参数提供默认值
>示例:为了使参数是可选的,可以提供默认值,
//创建
USE Northwind
GO

CREATE PROC spInsertShipperOptionalPhone
    @CompanyName NVARCHAR(40),
    @Phone NVARCHAR(24) = NULL
AS
    INSERT INTO Shippers VALUES (@CompanyName, @Phone);
// 执行
EXEC spInsertShipperOptionalPhone 'Speedy Shippers, Inc';
3、创建输出参数
// 创建
USE Northwind
GO

CREATE PROC spInsertOrder
    @CustomerID NVARCHAR(5),
    @EmployeeID INT,
    @OrderDate DATETIME = NULL,
    @RequiredDate DATETIME = NULL,
    @ShippedDate DATETIME = NULL,
    @ShipVia INT,
    @Freight MONEY,
    @ShipName NVARCHAR(40) = NULL,
    @ShipAddress NVARCHAR(60) = NULL,
    @ShipCity NVARCHAR(15) = NULL,
    @ShipRegion NVARCHAR(15) = NULL,
    @ShipPostalCode NVARCHAR(10) = NULL,
    @ShipCountry NVARCHAR(15) = NULL,
    @OrderID INT OUTPUT
AS
    INSERT INTO Orders
    VALUES
    (
        @CustomerID,
        @EmployeeID,
        @OrderDate,
        @RequiredDate,
        @ShippedDate,
        @ShipVia,
        @Freight,
        @ShipName,
        @ShipAddress,
        @ShipCity,
        @ShipRegion,
        @ShipPostalCode,
        @ShipCountry
    )

SELECT @OrderID = @@IDENTITY

// 执行
USE Northwind
GO

DECLARE @MyIdent INT

EXEC spInsertOrder
    @CustomerID = 'ALFKI',
    @EmployeeID = 5,
    @OrderDate = '5/1/1999'
    @ShipVia = 3,
    @Freight = 5.00,
    @OrderID = @MyIdenty OUTPUT

SELECT @MyIdent AS IdentityValue

SELECT OrderID, CustomerID, EmployeeID, OrderDate, ShipName FROM Orders WHERE OrderID = @MyIdent
切记,在存储过程声明中,输出参数需要使用OUTPUT关键字;调用存储过程的时候也必须使用OUTPUT关键字,才能保证参数被正确的输出,注意如果没有使用OUTPUT关键字,不会产生任何错误,但是此时输出参数的值将是无法保证的;赋给输出变量的变量不需要和存储过程中的内部参数拥有相同的名称,例如在本例中,内部参数叫做@OrderID,而传给值的变量叫做@MyIdent;需要使用EXEC(或EXECUTE)关键字来调用存储过程;

12.5 流控制语句
>说明:T(TRANSACTION)-SQL提供大多数流控制语句的典型的选择,IF...ELSE;GOTO;WHILE;WAITFOR;TRY/CATCH;同样也有CASE语句,但是它没有像其他语言中预期的那种流控制级的能力;
12.5.1 IF...ELSE语句
>说明:IF...ELSE语句的实现方式和C是接近相同的,其中的表达式可以是取布尔值的任意表达式;
>语法:
IF <Boolean Expression>
    <SQL statement> | BEGIN <code series> END
[ELSE
    <SQL statement> | BEGIN <code series> END]
切记,不恰当的使用NULL值是个常见的陷阱;例如经常会有如下错误出现:IF @MyVar = NULL,在大多数系统上(遵循ANSI标准)这样的表达式永远都不会为真,并且为绕过所有的NULL值结束;想要判断一个值是否为空应该这样来写:IF @MyVar IS NULL,不要忘记了NULL不等于任何值——甚至是NULL,不要使用"="而要使用"IS";
>DATEDIFF函数:
语法:DATEDIFF (<datepart>, <start date>, <end date>) ;
说明:DATEDIFF可以比较日期型数据的任意部分,可以从年到毫秒。start date和end date参数是合法的日期表达式。datepart参数可以是下列的值,年year, yy, yyyy;季度quarter,qq,q;月month, mm,m;星期week,dw,w;日day,dd,d;时hour,hh;分minute, mi,n;秒second, ss,s;毫秒millisecond,ms;
>ELSE子句:结果返回值为NULL的表达式会被当作FALSE从而进入ELSE子句。也就是说,如果IF子句中的语句返回值为FALSE或者NULL,则执行ELSE子句中的语句;
>从DATETIME字段中截取时间:
说明:
为了能截取日期信息,要么把日期分成多个部分,然后不带时间地进行重组,要么可以使用CONVERT函数,该函数能把它转换为不带时间的日期,并且也能把它转换回来;CONVERT()原来是SQL Server中唯一一个用来在数据类型之间转换数据的方法。现在,CAST()复制了它的大部分功能,并且是兼容ANSI的;然而,CONVERT()还是有一些特殊的日期格式化处理的能力,这些是CAST所不具备的;
语法:
CONVERT (<target data type>, <expression to be converted>, <style>) ;前两个参数简单明了,最后一个参数只应用于处理时期的时候,其目的是告诉SQL Server需要的日期格式。这些普通日期格式的示例包括1,这是美国mm/dd/yy格式的标准;以及12,这是ISO格式(yymmdd)。给任意的格式加上100会给日期模式加入整个世纪的时间(即年份用4位数表示,例如101样式为mm/dd/yyyy);
示例:
SELECT CONVERT(DATETIME, (CONVERT(VARCHAR, GETDATE(), 112));这样会处理ANSI的日期格式并能再次转换回来;
>在存储过程中实现ELSE语句:
USE Northwind
GO

ALTER PROC spInsertOrder
    @CustomerID NVARCHAR(5),
    @EmployeeID INT,
    @OrderDate DATETIME = NULL,
    @RequiredDate DATETIME = NULL,
    @ShippedDate DATETIME = NULL,
    @ShipVia INT,
    @Freight MONEY,
    @ShipName NVARCHAR(40) = NULL,
    @ShipAddress NVARCHAR(60) = NULL,
    @ShipCity NVARCHAR(15) = NULL,
    @ShipRegion NVARCHAR(15) = NULL,
    @ShipPostalCode NVARCHAR(10) = NULL,
    @ShipCountry NVARCHAR(15) = NULL,
    @OrderID INT OUTPUT
AS
    DECLARE @InsertedOrderDate SMALLDATETIME
    IF DATEDIFF(dd, @OrderDate, GETDATE()) > 7
        SELECT @InsertedOrderDate = NULL
    ELSE
        SELECT @InsertedOrderDate = CONVERT(DATETIME, CONVERT(VARCHAR, @OrderDate, 112))

    INSERT INTO Orders
    VALUES
    (
        @CustomerID,
        @EmployeeID,
        @OrderDate,
        @RequiredDate,
        @ShippedDate,
        @ShipVia,
        @Freight,
        @ShipName,
        @ShipAddress,
        @ShipCity,
        @ShipRegion,
        @ShipPostalCode,
        @ShipCountry
    )
    SELECT @OrderID = @@IDENTITY
> 把代码分组为块:
说明:SQL Server提供了把代码分组为块的方法,可以认为这个块是属于一起的。这个块以BEGIN语句开始,然后直到END语句结束;
语法:
IF <expression>
BEGIN
    ...
    ...

    IF <expression>
    BEGIN
        ...
        ...
    END
    ...
END
ELSE
BEGIN
    ...
    ...
END
12.5.2 CASE语句
>说明:
CASE语句在某种程度上与一些编程语言中的一些不同语句是等价的,如 C、C++、Delphi中的switch;Visual Basic中的select case;COBOL中的evaluate;在T-SQL中使用CASE语句的一个很大的缺点是:在很多方面,它更像替换运算符而非流控制语句;编写CASE语句的方式不只一种——可以使用输入表达式或者布尔表达式。第一种方法是使用一个输入表达式来与每个WHEN子句中用到的值进行比较。SQL Server文档把这种方法称为简单CASE,第二种方法将提供一个表达式,其中每个WHEN子句的值将为TRUE或者FALSE。相关文档把它称为搜索CASE;
>简单CASE:
语法:
CASE <input expression>
WHEN <when expression> THEN <result expression>
[...n]
[ELSE <result expression>]
END
示例:简单CASE使用结果等于布尔值的表达式,
USE Northwind
GO
SELECT TOP 10 OrderID, OrderID % 10 AS 'Last Digit', Position =
CASE OrderID % 10
    WHEN 1 THEN 'First'
    WHEN 2 THEN 'Second'
    WHEN 3 THEN 'Third'
    WHEN 4 THEN 'Fourth'
    ELSE 'Something Else'
END
FROM Orders
>搜索CASE:搜索CASE语句和简单CASE语句非常相同,它只有两个很细微的不同点:没有输入表达式;WHEN表达式必须为布尔值;
语法:
CASE
WHEN <Boolean expression> THEN <result expression>
[...n]
[ELSE <result expression>]
END
示例:
USE Northwind
GO
SELECT TOP 10 OrderID % 10 AS "Last Digit", ProductID, "How Close?" =
    CASE
        WHEN (OrderID % 10) < 3 THEN 'Ends with less than three'
        WHEN ProductID = 6 THEN 'ProductID is 6'
        WHEN ABS(OrderID % 10 - ProductID) <= 1 THEN 'Within 1'
        ELSE 'More than one apart'
    END
FROM OrderDetails
WHERE ProductID < 10
ORDER BY OrderID DESC
切记,可以使用CASE语句最好的方式是把它与SELECT语句放一起使用;注意SQL Server求值的工作方式:即使两个条件都为真,但只使用第一个条件;不需要使用"break"语句,在一个条件满足后自动终止;可以在条件表达式中混合和匹配正在使用的字段;只要最后等于布尔值的结果,则可以执行任何表达式;
12.5.3 使用WHILE语句循环
>语法:
WHILE <boolean expression>
    <sql statement> |
[BEGIN
    <statement block>
    [BREAK]
    <sql statement>|<statement block>
    [CONTINUE[
END]
切记,在WHILE语句中必须跟上BEGIN...END,其中包含整个语句块;
12.5.4 WAITFOR语句
>语法:使用WAITFOR语句可以让SQL Server来做等待工作。它的语法也很简单,
WAITFOR DELAY <time>
WAITFOR TIME <time>
>DELAY参数:DELAY参数指定等待的总时间。但是不能指定天数,而只能是小时、分钟和秒数。允许延时的最大值为24小时。示例:WAITFOR DELAY '01:00'将会等待一个小时,之后再运行WAITFOR后面的代码;
>TIME参数:TIME参数指定了需要等待的具体的时间。同样,不能指定日期作为参数,而只能是24小时内的时间。例如:WAITFOR TIME '01:00'将会等到凌晨1点,之后再运行WAITFOR后面的代码;
12.5.5 TRY/CATCH块
简而言之,如果代码没有任何类型的异常,或者错误级别是10或者10以下的话,则会根据TRY块执行代码。但是,一旦代码出现的错误超过了10(11或者更高)的话,则会马上转移到CATCH块中来;
12.6 通过返回值确认成功或失败
说明:返回值指示存储过程的成功或者失败,甚至是成功或失败的范围或属性;
>RETURN的工作方式:
解释:事实上,不管是否提供返回值,程序都会收到一个返回值;SQL Server默认地会在完成存储过程时自动返回一个0值;为了从存储过程向调用代码返回值,只需要使用RETURN语句:RETURN [<integer value to return>];切记,返回值必须是整数;RETURN语句是无条件地从存储过程中退出的;
12.7 处理错误
简介:在SQL Server中可能会发生3种常见的错误类型:会产生运行时错误并终止代码运行的错误;SQL Server知道的错误,但是它不产生使代码停止运行的运行时错误,这些错误也可以成为内联错误;在逻辑上很明显但在SQL Server中不太引起注意的错误;
12.7.1 以前的方式
说明:以前的方式需要在代码中监视错误的条件,然后决定在检测到错误的时候(很可能是在发生实际错误过后)要做的处理;
1. 处理内联的错误
说明:内联错误是指那些能在SQL Server中继续运行,但是因为某种原因而不能成功完成指定任务的错误。例如,违反外键约束的插入。SQL Server会拒绝执行该语句并输出错误信息,但不会终止代码运行;
2. 利用@@ERROR
说明:@@ERROR包含最后的T-SQL语句执行的错误号;如果该值为0,则表示没有发生错误;切记:每个新语句都会使@@ERROR复位;
3. 在存储过程中使用@@ERROR
USE Northwind
GO
ALTER PROC spInsertOrder
@CustomerID NVARCHAR(5),
@EmployeeID INT,
@OrderDate DATETIME = NULL,
@RequiredDate DATETIME = NULL,
@ShippedDate DATETIME = NULL,
@ShipVia INT,
@Freight MONEY,
@ShipName NVARCHAR(40) = NULL,
@ShipAddress NVARCHAR(60) = NULL,
@ShipCity NVARCHAR(15) = NULL,
@ShipRegion NVARCHAR(15) = NULL,
@ShipPostalCode NVARCHAR(10) = NULL,
@ShipCountry NVARCHAR(15) = NULL,
@OrderID INT OUTPUT
AS
DECLARE @InsertedOrderDate SMALLDATETIME
DECLARE @Error INT
IF DATEDIFF(dd, @OrderDate, GETDATE()) > 7
BEGIN
    SELECT @InsertedOrderDate = NULL
    PRINT 'Invalid Order Date'
    PRINT 'Supplied Order Date was greater than 7 days old.'
    PRINT 'The value has been reset to NULL'
ELSE
BEGIN
    SELECT @InsertedOrderDate =
        CONVERT(DATETIME, CONVERT(VARCHAR, @OrderDate, 112))
    PRINT 'The time of Day in Order Date was truncated'
END
INSERT INTO Orders
VALUES
(
    @CustomerID,
    @EmployeeID,
    @OrderDate,
    @RequiredDate,
    @ShippedDate,
    @ShipVia,
    @Freight,
    @ShipName,
    @ShipAddress,
    @ShipCity,
    @ShipRegion,
    @ShipPostalCode,
    @ShipCountry
)
SELECT @Error = @@ERROR
IF @Error != 0
BEGIN
    IF @Error = 547
    BEGIN
        PRINT 'Supplied data violates data integrity rules'
        PRINT 'Check that the supplied customer number exists'
        PRINT 'in the system and try again'
    END
    ELSE
    BEGIN
        PRINT 'An unknown error occurred. Contact your System'
        PRINT 'Administrator. The error was number ' +
        CONVERT(VARCHAR, @Error)
    END
    RETURN @Error
END
SELECT @OrderID = @@IDENTITY
--调用
USE Northwind
GO
DECLARE @MyIdent INT
DECLARE @MyDate SMALLDATETIME
DECLARE @Return INT
SELECT @MyDate = GETDATE()
EXEC @Return = spInsertDateValidatedOrder
    @CustomerID = 'ZXZXZ',
    @EmployeeID = 5,
    @OrderDate = @MyDate,
    @ShipVia = 3,
    @Freight = 5.00,
    @OrderID = @MyIdent OUTPUT
IF @Return = 0
    SELECT OrderID, CustomerID, EmployeeID, OrderDate, ShipName
    FROM Orders
    WHERE OrderID = @MyIdent
ELSE
    PRINT 'Value Returned was ' + CONVERT(VARCHAR, @Return)
4、TRY/CATCH块
语法:SQL Server中的TRY/CATCH块与C系列语言类似,语法如下,
BEGIN TRY
    {<sql statements>}
END TRY
BEGIN CATCH
    {<sql statements>}
END CATCH
切记,正如之前提到过,0~10的错误不会跳出TRY语句块,11~19之间的错误会立即跳出TRY语句块,进入CATCH语句块中;
>应用在TRY/CATCH中的几个专用函数:ERROR_NUMBER() INT 在CATCH块中调用时,返回导致运行CATCH块的错误消息的错误号,如果在CATCH块作用域以外调用,则返回NULL;ERROR_SEVERITY() INT 在CATCH块中调用时,返回导致CATCH块运行的错误消息的严重级别,如果在CATCH块作用域以外调用,则返回NULL;ERROR_STATE() INT 当在CATCH块中调用时,返回导致CATCH块运行的错误消息的状态号,如果在CATCH块作用域以外调用,则返回NULL;ERROR_PROCEDUER() NVARCHAR(126) 在CATCH块中调用时,返回出现错误的存储过程名称,如果该错误未在存储过程或触发器中出现,则返回NULL;如果在CATCH块作用域以外调用,则返回NULL;ERROR_LINE() INT 当在CATCH块中调用时:返回发生错误的行号,如果错误发生在存储过程或触发器中,则返回例程中的行号,如果在CATCH块作用域以外调用,则返回NULL;ERROR_MESSAGE NVARCHAR(2048) 在CATCH块中调用时,返回导致CATCH块运行的错误消息的完整文本,该文本包括为所有可替换参数提供的值,如长度、对象名或时间,如果在CATCH块作用域以外调用,则返回NULL;
12.7.2 在错误发生前处理错误
12.7.3 手动地激活错误
SQL Server允许客户端创建一个运行时错误,客户端可以使用它来调用错误处理程序并采取相应的动作。此处使用T-SQL中的RAISERROR命令来完成。它的语法如下:
RAISERROR (<message ID | message string>, <severity>, <state>
[, <argument> [, <...n>]])
[WITH OPTION [, ...n]]
1. 消息ID/消息字符串
消息ID或消息字符串决定了向客户端发送的消息;使用消息ID会手动地激活指定的ID以及和该ID相关信息的错误,这个信息可以在master数据库中的sysmessages表中找到;
提示,如果想要了解SQL Server中预先确定的消息,那么可以执行SELECT * FROM master.sysMessages;这会包含使用sp_addmessage存储过程或通过Enterprise Manager手动添加到系统的任何消息;可以以特殊文本的形式提供消息字符串,而不是在sysmessages中创建更持久的消息:RAISERROR ('Hi there, I''m an error', 1, 1);会激活一个简单的错误信息:Msg 50000, Level 1, State 50000 Hi there, I'm an error注意一下对齐的消息号是50000,即使我们并没有提供它。这是对任何特别错误的默认错误值。可以使用WITH SETERROR选项来重写它;
2. 严重性
说明:严重性是基于该错误究竟有多差的指标。可是对于SQL Server,严重性代码的意义有些古怪。它们基本上可以从报告性的(严重性1~18)、到系统级的(19~25)甚至是灾难性的(20~25)。如果激活错误的严重性是19或更高的话(系统级的),那么也必须要指定WITH LOG选项。20以及更高级别会自动终止用户的连接;
类别:1~9纯报告性的,但是会在消息中返回一个特定的错误代码,无论在RAISERROR中设置何种状态,它总会以相同的错误号结束;10同样是报告性的,但是不会在客户端激活一个错误而且除了错误文本外,不会提供任何特定错误信息;11~16这些都会终止存储过程的执行并在客户端激活一个错误,根据这点,会根据任何设定的状态值去显示状态;17通常只有SQL Server会使用这个严重性,它基本上只是SQL Server用完了资源而且不能完成请求;18、19这些都是非常严重的错误,而且暗示系统管理员要注意其中根本的原因,对于19来说,需要使用WITH LOG选项,并且如果使用NT或者Win 2K家族的操作系统,则该事件会写入它们的事件日志中去;20~25本质上讲,它们是致命的错误,会终止连接;
3. 状态
状态是个特殊的值。它会认出相同的错误会在代码中多次出现。这个概念给予了发送位置标记的机会,这个位置正好是发生错误的地方。状态值可以在1到127之间;
4. 错误参数
一些预先确定的错误会接受参数。这通过改变错误特有的性质来使错误在本质上更加的动态化。也可以格式化错误信息来接收参数。
动态信息通过使用占位符来完成。所有的占位符以%开始,而且根据传递的信息类别对它们进行编码:
占位符类型指示符 类型值
D或i     带符号整数
O    无符号八进制数
P    指针
S    字符串
U    无符号整数
X或x    无符号十六进制数
另外,还可以使用一些额外的标记和宽度信息来作为任何这些占位符的前缀:
标记    作用
-    左调整——只在确定宽度的时候起作用
+    如果符号是带符号的数据类型,则指示参数为正或为负
0    在数值类型值的左边填充0直到达到了在宽度选项中指定的宽度
#    只用于八进制和十六进制。根据是八进制还是十六进制来使用适当的前缀(0或0x)
空格    如果数值为正,则在该值的左边填入空格
宽度    设定想要为参数所保留的空间,指定"*"来自动地确定宽度
精度    设定输出的数值型数据的最大位数
长/短    当参数类型为整数、八进制或十六进制时,使用h(short)或l(long)来设定。
5. WITH OPTION选项,现有三个选项可供使用:LOG、SETERROR、NOWAIT;
>WITH LOG:这会告诉SQL Server在SQL Server错误日志和NT应用程序日志中记录错误,这个选项需要的严重性级别要在19或19以上;
>WITH SETERROR:默认地,RAISERROR命令不会给@@ERROR设置所产生的错误值——而@@ERROR反映了实际RAISERROR命令是成功或失败的;SETERROR重写了这个值并且把@@ERROR的值设为等于自己错误ID的值。
>WITH NOWAIT:立即向客户通知错误;
12.7.4 添加自定义的错误消息
可以使用系统存储过程来向系统添加错误消息。这个存储过程称为sp_addmessage,语法如下:
sp_addmessage [@msgnum = ] <msg id>,
[@severity =] <severity>,
[@msgtest =] <'msg'>
[, [@lang =] <'language'>]
[, [@with_log =] [TRUE | FALSE]]
[, [@replace =] 'replace']
除了@lang、@replace和@with_log有一点区别外,其他参数的含义与RAISERROR中是一样的;
1. @lang:这个参数指定了消息应用的语言。这里可以指定消息为任何语言的版本,只要在syslanguages中支持这些语言;
2. @with_log:它和RAISERROR中的原理一样;
3. @replace:如果是编辑现有的信息而非创建一个新消息的话,那么必须把@replace参数设置为"REPLACE"。如果不这样做,那么如果消息已经存在,则会得到一个错误;
4. 使用sp_addmessage
示例——添加自定义的消息来告诉告诉用户关于订购日期的问题:
sp_addmessage
    @msgnum = 60000
    @severity = 10
    @msgtest = '%s is not a valid Order data. Order date must be within 7 days for current date.'
5. 删除已有的自定义消息
要删除自定义消息,请使用:sp_dropmessage <msg num>

这篇关于SqlServer_SQLServer2005存储过程概述;的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018865

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间