--参考代码:
CREATE  proc pr_ValueList2ErrorInfo
asdeclare @t table (
GroupId int,
FieldName varchar(80),
valuelist varchar(1000)
)
insert @t select
GroupId,
FieldName,
stuff(valuelist,1,PATINDEX('%?[A-D,1-9][0-9][0-9][0-9][0-9]%',valuelist)-1,'')
from temptab
where PATINDEX('%?[A-D,1-9][0-9][0-9][0-9][0-9]%',valuelist)>0
while exists (
select 1 from @t where PATINDEX('%?[A-D,1-9][0-9][0-9][0-9][0-9]%',valuelist)>0
)
begin
insert tbErrorInfo
select 
a.Id,0 as Type,
left(valuelist,6) as Code,
stuff(left(valuelist,case when charindex(',?',valuelist)>0 then charindex(',?',valuelist)-1 else len(valuelist) end ),1,6,'') as ErrInfo
from tbFieldsConfig a,@t b
where a.GroupId=b.GroupId
and a.FieldName=b.FieldName
and not exists (
select 1 from tbErrorInfo
where id=a.id
and code=left(valuelist,6)
) update @t
set valuelist=case when charindex(',?',valuelist)>0 then stuff(valuelist,1,charindex(',?',valuelist),'') else '' end delete @t where valuelist=''
end
GO===========================================================================
谁能帮我解释一下以下几个函数的意思:
1、stuff(valuelist,1,PATINDEX('%?[A-D,1-9][0-9][0-9][0-9][0-9]%',valuelist)-1,'')
2、charindex(',?',valuelist)>0 
===========================================================================

解决方案 »

  1.   

    charindex直接看联机从书
    patindex类似于charindex,不过可以按模式匹配.
    [0-9]可以匹配0-9中10个数字中的任一个.
    [A-D,1-9]表示 可以是ABCD123456789中的任一个,它不匹配E或0或F等等
    [0-9][0-9]匹配两个0-9中的任意一个.struff查看联机丛书.
      

  2.   

    1、stuff(valuelist,1,PATINDEX('%?[A-D,1-9][0-9][0-9][0-9][0-9]%',valuelist)-1,'') ------------------
    stuff()函數是從valuelist這個字符串中,從1個起刪除n個字符,用''來代替.
    其中 patindex是模糊查找一個字符串在另一個字符串的位置,
    '?[A-D,1-9][0-9][0-9][0-9][0-9]'表示第一個字符為任意字符,第二個字符可以是字母A-D或數字1-9,後面的類似.2、charindex(',?',valuelist)> 0   ------------
    charindex和patindex()有點類似,但charindex()不能用來模糊查詢,也就是不能使用通配符'%'樓主應多看聯機幫助.
      

  3.   

    ---from 联机丛书1.STUFF
    删除指定长度的字符并在指定的起始点插入另一组字符。语法
    STUFF ( character_expression , start , length , character_expression ) 参数
    character_expression由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。start是一个整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。length是一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。返回类型
    如果 character_expression 是一个支持的字符数据类型,则返回字符数据。如果 character_expression 是一个支持的 binary 数据类型,则返回二进制数据。注释
    可以嵌套字符串函数。示例
    下例通过在第一个字符串 (abcdef) 中删除从第二个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,创建并返回一个字符串。 SELECT STUFF('abcdef', 2, 3, 'ijklmn')
    GO下面是结果集:--------- 
    aijklmnef (1 row(s) affected)--------------------------------------------------------------------------2.PATINDEX返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。语法
    PATINDEX ( '%pattern%' , expression ) 参数
    pattern一个字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式。expression一个表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别。返回类型
    int注释
    PATINDEX 对 text 数据类型很有用;除 IS NULL、IS NOT NULL 和 LIKE(这些是 WHERE 子句中对 text 类型有效的仅有的其它比较运算)外,PATINDEX 也可用于 WHERE 子句中。如果 pattern 或 expression 为 NULL,则当数据库的兼容级别为 70 时 PATINDEX 返回 NULL;如果数据库兼容级别为 65 或更靠前,则仅当 pattern 和 expression 同时为 NULL 时,PATINDEX 返回 NULL。示例
    A. 在 PATINDEX 中使用模式
    本示例查找模式"wonderful"在 titles 表中 notes 列的某一特定行中的开始位置。USE pubs
    GO
    SELECT PATINDEX('%wonderful%', notes)
    FROM titles
    WHERE title_id = 'TC3218'
    GO下面是结果集:----------- 
    46          (1 row(s) affected)------------------------------------------------------------------------
    3.CHARINDEX返回字符串中指定表达式的起始位置。 语法
    CHARINDEX ( expression1 , expression2 [ , start_location ] ) 参数
    expression1一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。expression2一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。start_location在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2 的起始位置开始搜索。返回类型
    int注释
    如果 expression1 或 expression2 之一属于 Unicode 数据类型(nvarchar 或 nchar)而另一个不属于,则将另一个转换为 Unicode 数据类型。如果 expression1 或 expression2 之一为 NULL 值,则当数据库兼容级别为 70 或更大时,CHARINDEX 返回 NULL 值。当数据库兼容级别为 65 或更小时,CHARINDEX 仅在 expression1 和 expression2 都为 NULL 时返回 NULL 值。 如果在 expression2 内没有找到 expression1,则 CHARINDEX 返回 0。示例
    第一个代码示例返回序列"wonderful"在 titles 表的 notes 列中开始的位置。第二个示例使用可选的 start_location 参数从 notes 列的第五个字符开始寻找"wonderful"。第三个示例显示了当 expression2 内找不到 expression1 时的结果集。USE pubs
    GO
    SELECT CHARINDEX('wonderful', notes)
    FROM titles
    WHERE title_id = 'TC3218'
    GO-- Use the optional start_location parameter to start searching 
    -- for wonderful starting with the fifth character in the notes
    -- column.
    USE pubs
    GO
    SELECT CHARINDEX('wonderful', notes, 5)
    FROM titles
    WHERE title_id = 'TC3218'
    GO下面是第一个查询和第二个查询的结果集:----------- 
    46          (1 row(s) affected)USE pubs
    GO
    SELECT CHARINDEX('wondrous', notes)
    FROM titles
    WHERE title_id='TC3218'
    GO下面是结果集。
    ----------- 
    0          (1 row(s) affected)
      

  4.   

    STUFF
    删除指定长度的字符并在指定的起始点插入另一组字符。语法
    STUFF ( character_expression , start , length , character_expression ) 参数
    character_expression由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。start是一个整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。length是一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。返回类型
    如果 character_expression 是一个支持的字符数据类型,则返回字符数据。如果 character_expression 是一个支持的 binary 数据类型,则返回二进制数据。注释
    可以嵌套字符串函数。示例
    下例通过在第一个字符串 (abcdef) 中删除从第二个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,创建并返回一个字符串。 SELECT STUFF('abcdef', 2, 3, 'ijklmn')
    GO下面是结果集:--------- 
    aijklmnef (1 row(s) affected)
      

  5.   

    使用 STUFF
    STUFF 函数将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。如果开始位置或长度的值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。下面的示例将字符串"xyz"置于字符表达式"abc"的第二个字符处,并总共替换三个字符。SELECT STUFF('abc', 2, 3, 'xyz')下面是结果集:----
    axyz(1 row(s) affected)
      

  6.   

    CHARINDEX
    返回字符串中指定表达式的起始位置。 语法
    CHARINDEX ( expression1 , expression2 [ , start_location ] ) 参数
    expression1一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。expression2一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。start_location在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2 的起始位置开始搜索。返回类型
    int注释
    如果 expression1 或 expression2 之一属于 Unicode 数据类型(nvarchar 或 nchar)而另一个不属于,则将另一个转换为 Unicode 数据类型。如果 expression1 或 expression2 之一为 NULL 值,则当数据库兼容级别为 70 或更大时,CHARINDEX 返回 NULL 值。当数据库兼容级别为 65 或更小时,CHARINDEX 仅在 expression1 和 expression2 都为 NULL 时返回 NULL 值。 如果在 expression2 内没有找到 expression1,则 CHARINDEX 返回 0。示例
    第一个代码示例返回序列"wonderful"在 titles 表的 notes 列中开始的位置。第二个示例使用可选的 start_location 参数从 notes 列的第五个字符开始寻找"wonderful"。第三个示例显示了当 expression2 内找不到 expression1 时的结果集。USE pubs
    GO
    SELECT CHARINDEX('wonderful', notes)
    FROM titles
    WHERE title_id = 'TC3218'
    GO-- Use the optional start_location parameter to start searching 
    -- for wonderful starting with the fifth character in the notes
    -- column.
    USE pubs
    GO
    SELECT CHARINDEX('wonderful', notes, 5)
    FROM titles
    WHERE title_id = 'TC3218'
    GO下面是第一个查询和第二个查询的结果集:----------- 
    46          (1 row(s) affected)USE pubs
    GO
    SELECT CHARINDEX('wondrous', notes)
    FROM titles
    WHERE title_id='TC3218'
    GO下面是结果集。
    ----------- 
    0          (1 row(s) affected)
      

  7.   

    比较 CHARINDEX 和 PATINDEX
    CHARINDEX 和 PATINDEX 函数都返回指定模式的开始位置。PATINDEX 可使用通配符,而 CHARINDEX 不可以。这两个函数都带有两个参数: 希望获取其位置的模式。使用 PATINDEX,模式是可以包含通配符的字面字符串。使用 CHARINDEX,模式是字面字符串(不能包含通配符)。
    字符串值表达式(通常为列名),Microsoft® SQL Server™ 在其中搜索指定的模式。 
    例如,查找模式"wonderful"在 titles 表中 notes 列的某一特定行中的开始位置。USE pubsSELECT CHARINDEX('wonderful', notes)FROM titlesWHERE title_id = 'TC3218'下面是结果集:----------------46(1 row(s) affected)如果未限制搜索的行,查询将返回表中的所有行,并对在其中查找到该模式的所有行报告非零值,对其它行报告零值。例如,使用通配符查找模式"candies"在 Categories 表中的 Description 列的任一行中的开始位置:USE Northwind
    GO
    SELECT CategoryID, PATINDEX('%candies%', Description)AS POSITION
    FROM Categories
    WHERE PATINDEX('%candies%', Description) <> 0如果没有限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零值。PATINDEX 对 text 数据类型很有用;除 IS NULL、IS NOT NULL 和 LIKE(这些是 WHERE 子句中对 text 类型有效的仅有的其它比较运算)外,PATINDEX 也可用于 WHERE 子句中。