CHARINDEX() 在一个表达式中搜索另一个表达式并返回其起始位置(如果找到)。
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
expressionToFind
是字符表达式,其中包含要查找的序列。 expressionToFind限制为 8000 个字符。
expressionToSearch
要搜索的字符表达式。
start_location
是整数或bigint开始搜索的表达式。 如果start_location未指定、 为负数,或为 0,在搜索开始的开始处expressionToSearch。
bigint如果expressionToSearch的varchar (max), nvarchar (max),或varbinary (max)数据类型;否则为int。
--
[SQL]sql语句中charindex的用法
Posted on 2014-03-24 20:19 beeone 阅读(112222) 评论(0) 编辑 收藏假如你写过很多程序,你可能偶尔会碰到要确定字符或字符窜串否包含在一段文字中,在这篇文章中,我将讨论使用CHARINDEX和PATINDEX函数来搜索文字列和字符串。我将告诉你这两个函数是如何运转的,解释他们的区别。同时提供一些例子,通过这些例子,你可以可以考虑使用这两个函数来解决很多不同的字符搜索的问题。 CHARINDEX和PATINDEX函数常常用来在一段字符中搜索字符或者字符串。如果被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数。PATINDEX函数支持使用通配符来进行搜索,然而CHARINDEX不支持通佩符。接下来,我们逐个分析这两个函数。 如何使用CHARINDEX函数 CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , start_location ] ) Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。 CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如CHARINDEX没有找到要找的字符串,那么函数整数“0”。让我们看看下面的函数命令执行的结果: CHARINDEX(’SQL’, ’Microsoft SQL Server’) 这个函数命令将返回在“Microsoft SQL Server”中“SQL”的起始位置,在这个例子中,CHARINDEX函数将返回“S”在“Microsoft SQL Server”中的位置11。 接下来,我们看这个CHARINDEX命令: CHARINDEX(’7.0’, ’Microsoft SQL Server 2000’) 在这个例子中,CHARINDEX返回零,因为字符串“7.0” 不能在“Microsoft SQL Server”中被找到。接下来通过两个例子来看看如何使用CHARINDEX函数来解决实际的T-SQL问题。 第一个例子,假设你要显示Northwind数据库Customer表前5行联系人列的Last Name。这是前5行数据 ContactName ------------------------------ Maria Anders Ana Trujillo Antonio Moreno Thomas Hardy Christina Berglund 你可以看到,CustomName包含客户的First Name和Last Name,它们之间被一个空格隔开。我用CHARINDX函数确定两个名字中间空格的位置。通过这个方法,我们可以分析ContactName列的空格位置,这样我们可以只显示这个列的last name部分。这是显示Northwind的Customer表前5行last name的记录! select top 5 substring(ContactName,charindex(’ ’,ContactName)+1 , len(ContactName)) as [Last Name] from Northwind.dbo.customers 下面是这个命令输出的结果。 Last Name ------------------------------ Anders Trujillo Moreno Hardy Berglund
第三个参数 是整数或bigint开始搜索的表达式。 如果start_location未指定、 为负数,或为 0,在搜索开始的开始处expressionToSearch。
返回 bigint如果expressionToSearch的varchar (max), nvarchar (max),或varbinary (max)数据类型;否则为int。
-- 第三个参数 从此处 开始 才能往后找 但也是从头开始索引(此处之前的就算出现也都找不到)
SUBSTRING ( expression ,start , length )
返回SQL Server中字符,二进制,文本或图像表达式的一部分。
SUBSTRING ( expression ,start , length )
参数
expression 是一个字符,二进制,文本,ntext或图像表达式。
start 是一个整数或bigint表达式,指定返回字符的起始位置。(编号为1,表示表达式中的第一个字符为1)。如果start小于1,则返回的表达式将从expression中指定的第一个字符开始。在这种情况下,返回的字符数是start + 长度之和的最大值- 1或0.如果start大于值表达式中的字符数,则返回零长度表达式。
length 是一个正整数或bigint表达式,指定将返回表达式的多少个字符。如果长度为负值,则会生成错误,并且语句被终止。如果开始和长度的总和大于表达式中的字符数,则返回从开始处开始的整个值表达式。
返回类型
如果表达式是受支持的字符数据类型之一,则返回字符数据。如果表达式是支持的二进制数据类型之一,则返回二进制数据。返回的字符串与指定表达式的类型相同,但表中显示了异常。
指定的表达 | 返回类型 |
---|---|
char / varchar / text | VARCHAR |
nchar / nvarchar / ntext | 为nvarchar |
二进制 / varbinary / 图像 | VARBINARY |
开始和长度的值必须以文本,图像,二进制或varbinary数据类型的ntext,char或varchar数据类型和字节的字符数指定。
的表达式必须是VARCHAR(最大值)或VARBINARY(最大)时,开始或长度包含比2147483647大的值。
当使用补充字符(SC)归类时,起始和长度都将表达式中的每个替代对作为单个字符进行计数。有关更多信息,请参阅整理和Unicode支持。
--第一个参数 待截取字符
--第二个参数 截取位置
--第三个参数 截取长度
文本,text,ntext和图像数据
文本数据作为varchar返回,图像数据作为varbinary返回
https://docs.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql
PATINDEX
返回指定表达式中第一次出现的模式的起始位置,如果找不到模式,则返回所有有效的文本和字符数据类型的零。
PATINDEX('%pattern%',表达式)
PATINDEX(Transact-SQL)
返回指定表达式中第一次出现的模式的起始位置,如果找不到模式,则返回所有有效的文本和字符数据类型的零。
返回类型
bigint 如果表达式是 varchar(max)或 nvarchar(max)数据类型; 否则 int。
备注
如果模式或表达式都是NULL,则PATINDEX返回NULL。
PATINDEX根据输入的排序规则执行比较。要在指定的归类中执行比较,可以使用COLLATE将明确的归类应用于输入。
补充字符(代理对)
使用SC排序规则时,返回值会将expression参数中的任何UTF-16代理对计为单个字符。有关更多信息,请参阅整理和Unicode支持。
0x0000(char(0))是Windows排序规则中未定义的字符,不能包含在PATINDEX中。
--返回 指定表达式 中第一次出现的模式的起始位置,
--如果找不到模式,则返回所有有效的文本和字符数据类型的零。
--PATINDEX就像LIKE一样工作,所以你可以使用任何通配符。
--您不必在百分比之间附上图案。PATINDEX('a%','abc')返回1,
--PATINDEX('%a','cba')返回3。
raise error 增加 异常
RAISERROR 用于将与 SQL Server 数据库引擎生成的系统错误或警告消息使用相同格式的消息返回到应用程序中。
RAISERROR 还可以返回:
-
已通过 sp_addmessage 系统存储过程创建的用户定义的错误消息。这些消息的消息号大于 50000;可在 sys.messages 目录视图中查看这些消息。
-
在 RAISERROR 语句中指定的消息字符串。
RAISERROR 还可以:
-
分配特定的错误号、严重度和状态。
-
请求将错误记录到数据库引擎错误日志和 Microsoft Windows 应用程序日志中。
-
将参数值代入消息正文中,这与 C 语言中的 printf_s 函数非常相似。
RAISERROR 和 PRINT 都可以用来将信息性消息或警告消息返回到某个应用程序中。RAISERROR 返回的消息正文可以使用类似 C 标准库中的 printf_s 函数的字符串替换功能来生成,然而 PRINT 只能返回字符串或字符表达式。如果在 TRY...CATCH 构造的 TRY 块中执行的 RAISERROR 严重度介于 11 到 19 之间,会导致将控制传递到关联的 CATCH 块。如果指定 10 或更低的严重度,将使用 RAISERROR 返回消息,而不调用 CATCH 块。PRINT 不会将控制传输到 CATCH 块。
当 RAISERROR 在 sys.messages 中与用户定义消息的 msg_id 一起使用时,msg_id 作为 SQL Server 错误号或本机错误代码返回。而当 RAISERROR 用于 msg_str 而不是 msg_id 时,则返回的 SQL Server 错误号和本机错误号为 50000。
当使用 RAISERROR 返回用户定义的错误消息时,请在每个引用该错误的 RAISERROR 中使用不同的状态号码。这可以在发生错误时帮助进行错误诊断。
使用 RAISERROR 可以:
-
帮助对 Transact-SQL 代码进行故障排除。
-
检查数据值。
-
返回包含变量文本的消息。
-
导致执行从 TRY 块跳到关联的 CATCH 块。
-
将错误信息从 CATCH 块返回到进行调用的批处理或应用程序。
以下示例将替换返回到应用程序的消息中的 DB_ID() 和 DB_NAME() 函数的值:
SQL Server 中 RAISERROR 的用法
raise 增加; 提高; 提升
其语法如下:
{ ,severity ,state }
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]
简要说明一下:
msg_id:表示可以是一个sys.messages表中定义的消息代号;
使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。
用户定义错误消息的错误号应当大于 50000。
msg_str:表示也可以是一个用户定义消息,该错误消息最长可以有 2047 个字符;
(如果是常量,请使用N'xxxx',因为是nvarchar的)
当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。
@local_variable:表示也可以是按照 msg_str 方式的格式化字符串变量。
第二个参数:severity
用户定义的与该消息关联的严重级别。(这个很重要)
任何用户都可以指定 0 到 18 之间的严重级别。
[0,10]的闭区间内,不会跳到catch;
如果是[11,19],则跳到catch;
如果[20,无穷),则直接终止数据库连接;
第三个参数:state
如果在多个位置引发相同的用户定义错误,
则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。
介于 1 至 127 之间的任意整数。(state 默认值为1)
当state 值为 0 或大于 127 时会生成错误!
第四个参数:argument
用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。
第五个参数:option
错误的自定义选项,可以是下表中的任一值:
LOG :在错误日志和应用程序日志中记录错误;
NOWAIT:将消息立即发送给客户端;
SETERROR:将 @@ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000;
SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)
N'This is message %s %d.', -- Message text,
10, -- Severity,
1, -- State,
N'number', -- First argument.
5 -- Second argument.
);
-- The message text returned is: This is message number 5.
GO
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
--A. 从 CATCH 块返回错误消息
以下代码示例显示如何在 TRY 块中使用 RAISERROR 使执行跳至关联的 CATCH 块中。
它还显示如何使用 RAISERROR 返回有关调用 CATCH 块的错误的信息。
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
--B. 在 sys.messages 中创建即席消息
以下示例显示如何引发 sys.messages 目录视图中存储的消息。
该消息通过 sp_addmessage 系统存储过程,以消息号50005添加到 sys.messages 目录视图中。
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO
RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
sp_dropmessage @msgnum = 50005;
GO
--C. 使用局部变量提供消息文本
以下代码示例显示如何使用局部变量为 RAISERROR 语句提供消息文本。
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO
RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
sp_dropmessage @msgnum = 50005;
GO
参考来源:
http://msdn.microsoft.com/zh-cn/library/ms178592.aspx
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/483588bd-021b-4eae-b4ee-216268003e79.htm