我需要检查SQL Server表中的列值(字符串)是否以小写字母开头,并且只能包含“_”,“ - ”,数字和字母。我知道我可以使用SQL服务器CLR功能。但是,我正在尝试使用标量UDF实现该验证,并且可以在这里做很少...我可以使用'NOT LIKE',但我不确定如何确保我验证字符串而不管字符的顺序或换句话说,在SQL中为此编写一个模式。我最好使用SQL CLR功能吗? 任何帮助将不胜感激..
提前致谢
感谢大家的评论。今天早上,我选择了CLR功能方式。为了达到我想要实现的目的,我创建了一个CLR函数,它对输入字符串进行验证并从SQL UDF中调用它并且它运行良好。
为了测量使用SQL CLR函数与t-SQL UDF的t-SQL UDF的性能,我创建了一个SQL CLR函数,它只检查输入字符串是否只包含小写字母,它应该返回true,否则为false从UDF(IsLowerCaseCLR)调用的。之后我还创建了一个常规的t-SQL UDF(IsLowerCaseTSQL),它使用'NOT LIKE'做同样的事情。 然后我创建了一个包含Name(varchar)和IsValid(bit)列的表(Person),并用名称填充它以进行测试。
数据: - 将'Ashish'作为Name列的值的1000条记录 带有'ashish'作为名称列
的值的1000条记录然后我运行了以下内容: - UPDATE Person Set IsValid = 1 WHERE dbo.IsLowerCaseTSQL(Name) 以上更新的1000条记录(Isvalid = 1)和不到一秒。
我删除了表格中的所有数据,并使用相同的数据重新填充了相同的数据。然后使用Sql CLR UDF(Isvalid = 1)更新同一个表,这需要3秒!
如果5000条记录发生更新,则与CLR UDF相比,常规UDF需要0秒,这需要16秒!
我对t-SQL正则表达式知之甚少,或者我可以测试我实际更复杂的验证标准。但我只是想知道,即使我已经写过,考虑到上面的例子,它会比SQL CLR函数更快。 我们是否正在使用SQL CLR,因为我们可以实现我们可以实现更丰富的逻辑,否则如果我们用常规SQL编写那么就很难。
很抱歉这篇长篇文章。我只是想知道专家。如果您在这里无法理解,请随时询问。
再次感谢您的时间。
答案 0 :(得分:4)
WHERE
ASCII(LEFT(column, 1)) BETWEEN ASCII('a') AND ASCII('z')
AND
column COLLATE LATIN1_GENERAL_BIN NOT LIKE '%[^-_a-zA-Z0-9]%'
默认情况下,你需要COLLATE来忽略重音(äàöetetc)
答案 1 :(得分:2)
CLR比UDF更快 - 对于这种情况,我将使用CLR允许我运行正则表达式进行比较。但PATINDEX支持有限的正则表达式语法,因此您可以使用:
WHERE PATINDEX('%[regex]%', t.column) > 0
...返回满足表达式的行,因为PATINDEX根据它正在测试的字符串中的第一个位置返回一个数字。如果值为零,则正则表达式不在字符串中。