代码之家  ›  专栏  ›  技术社区  ›  Ashish Gupta Shiva

在SQL Server-CLR函数或T-SQL中验证表中的字符串(问题已更新)

  •  3
  • Ashish Gupta Shiva  · 技术社区  · 15 年前

    我需要检查SQL Server表中的列值(字符串)是否以小写字母开头,并且只能包含“u”、“-”、数字和字母。我知道我可以使用sql server clr函数。但是,我正试图使用标量udf实现该验证,在这里可能做得很少……我可以使用'not like',但我不确定如何确保验证字符串而不考虑字符的顺序,或者换句话说,为此在sql中编写一个模式。使用sql clr函数更好吗? 任何帮助都将不胜感激。

    提前谢谢

    谢谢大家的评论。今天早上,我选择了CLR函数方式。为了达到我想要的目的,我创建了一个clr函数,它对输入字符串进行验证,并从sql udf调用该函数,它工作得很好。

    为了使用sql clr函数和t-sql udf来度量t-sqludf的性能,我创建了一个sqlclr函数,它只检查输入字符串是否只包含小写字母,它应该返回true-else-false,并从udf(islowercaseclr)调用它。之后,我还创建了一个常规的t-sql udf(islowercasetsql),它使用'not like'执行相同的操作。 然后我创建了一个表(person),其中包含列名称(varchar)和isvalid(bit)列,并用要测试的名称填充该表。

    数据: 1000条记录,名称列的值为“ashish” 1000条记录,名称列的值为“ashish”

    然后我运行以下命令: update person set isvalid=1,其中dbo.islowercasetsql(name) 更新了1000条以上的记录(IsValid=1) 不到一秒钟。

    我删除了表中的所有数据,并用相同的数据重新填充了相同的数据。然后使用sql clr udf(isvalid=1)更新同一个表 这花了3秒钟!

    如果对5000条记录进行更新,则常规UDF需要0秒,而CLR UDF需要16秒!

    我对t-sql正则表达式的了解很少,或者我可以测试实际更复杂的验证条件。但我只想知道,即使我可以写下它,考虑到上面的例子,它会比sql clr函数快吗? 我们使用sql clr是因为我们可以实现更丰富的逻辑,否则如果我们用普通的sql编写,就很难实现。

    很抱歉这么长的帖子。我只想从专家那里知道。如果你在这里什么都听不懂,请尽管问。

    再次感谢您抽出时间。

    2 回复  |  直到 15 年前
        1
  •  4
  •   gbn    15 年前
    WHERE
        ASCII(LEFT(column, 1)) BETWEEN ASCII('a') AND ASCII('z')
        AND
        column COLLATE LATIN1_GENERAL_BIN NOT LIKE '%[^-_a-zA-Z0-9]%'
    

    默认情况下,您需要使用collate来忽略重音(·etc)

        2
  •  2
  •   OMG Ponies    15 年前

    clr比udf快-在这种情况下,我将使用clr来允许我运行正则表达式进行比较。但是 PATINDEX 支持有限的正则表达式语法,因此可以使用:

    WHERE PATINDEX('%[regex]%', t.column) > 0
    

    …返回满足表达式的行,因为patindex根据它正在测试的字符串中的第一个位置返回一个数字。如果值为零,则正则表达式不在字符串中。