Function 执行tsql函数时出现问题

Function 执行tsql函数时出现问题,function,tsql,sql-server-2012,Function,Tsql,Sql Server 2012,我编写了以下函数: CREATE FUNCTION dbo.GetData (@value AS VARCHAR(MAX), @pattern AS VARCHAR(MAX), @masker AS VARCHAR, @notMaskedCount AS INT) RETURNS NCHAR(47) AS BEGIN DECLARE @nextPatIdx INT SET @nextPatIdx = PATINDEX('%' + @pattern +

我编写了以下函数:

CREATE FUNCTION dbo.GetData
   (@value AS VARCHAR(MAX),
    @pattern AS VARCHAR(MAX),
    @masker AS VARCHAR,
    @notMaskedCount AS INT) 
RETURNS NCHAR(47) 
AS BEGIN
   DECLARE @nextPatIdx INT
   SET @nextPatIdx = PATINDEX('%' + @pattern + '%', @value)

   WHILE @nextPatIdx > 0 AND @nextPatIdx < LEN(@value) - @notMaskedCount
   BEGIN
        SET @value = Stuff(@value, @nextPatIdx, 1, @masker)
        SET @nextPatIdx = PATINDEX('%' + @pattern + '%', @value)
   END
   RETURN CONVERT(NCHAR(40), @value) + '_data'
END
如果我执行它,抛出C#,并尝试读取数据,它抛出异常 如果我跑了viahttp://sqlfiddle.com/#!6/6ee81/1我出错了 它没有完成执行
有什么不对-函数/我调用它的方式?

您实现了一个无限循环,您可以使用以下代码进行检查:

---select dbo.GetData('152648494','[a-zA-Z0-9]', 'x', 4)
declare

@value AS VARCHAR(MAX) = '152648494',
@pattern AS VARCHAR(MAX) = '[a-zA-Z0-9]',
@masker AS VARCHAR(1) = 'x',
@notMaskedCount AS INT = 4 


DECLARE @nextPatIdx INT
SET @nextPatIdx = PATINDEX('%' + @pattern + '%', @value)

WHILE @nextPatIdx > 0 AND @nextPatIdx < LEN(@value) - @notMaskedCount
BEGIN
    SET @value = Stuff(@value, @nextPatIdx, 1, @masker)
    SET @nextPatIdx = PATINDEX('%' + @pattern + '%', @value)
    print @nextPatIdx;
END

print 'END'
select CONVERT(NCHAR(40), @value) + '_data'

它将退出无限循环,但我需要更多的信息来了解您想要的输出

编辑

我想你需要改变你的循环

WHILE @nextPatIdx > 0 AND @nextPatIdx <= LEN(@value) - @notMaskedCount
BEGIN
    SET @value = Stuff(@value, @nextPatIdx, 1, @masker)
    --SET @nextPatIdx = PATINDEX('%' + @pattern + '%', @value)      
    SET @nextPatIdx += 1

END

而@nextPatIdx>0和@nextPatIdx是-正如您所见,我将“x”转换为masker@masker作为VARCHAR(1),我个人会使用
CHAR(1)
(而不是
VARCHAR(1)
)-对于单个字符,使用“可变长度”实际上没有任何好处
VARCHAR的属性
…您能告诉我们如何从C#调用它吗?@marc#u C-char(1)没有帮助输出应该是xxxxx 8494所有字母数字,尽管最后4,如果您只需要模糊最后4位以下的所有内容,为什么要使用patindex和@pattern?对于输入12 7 8912,结果将是xx x 8912
@nextPatIdx > 0
@nextPatIdx > 1
WHILE @nextPatIdx > 0 AND @nextPatIdx <= LEN(@value) - @notMaskedCount
BEGIN
    SET @value = Stuff(@value, @nextPatIdx, 1, @masker)
    --SET @nextPatIdx = PATINDEX('%' + @pattern + '%', @value)      
    SET @nextPatIdx += 1

END