我正在尝试写一个只获取特定字符之前的字符串的句子。例如:
DECLARE @TEST VARCHAR(MAX)
SET @TEST = 'CAMP1 = 4 AND CAMP2 = 5 OR CAMP3 = 7 AND CAMP4 = 9'
我正在尝试解析字符串@TEST
并仅一一获取营地并检查该营地(CAMP1、CAMP2、CAMP3、CAMP4)是否真的存在。
我不知道是否需要循环来扫描字符串并获取“=”之前和逻辑运算符“AND、OR”之后的字符串。
有什么帮助吗?
我正在尝试写一个只获取特定字符之前的字符串的句子。例如:
DECLARE @TEST VARCHAR(MAX)
SET @TEST = 'CAMP1 = 4 AND CAMP2 = 5 OR CAMP3 = 7 AND CAMP4 = 9'
我正在尝试解析字符串@TEST
并仅一一获取营地并检查该营地(CAMP1、CAMP2、CAMP3、CAMP4)是否真的存在。
我不知道是否需要循环来扫描字符串并获取“=”之前和逻辑运算符“AND、OR”之后的字符串。
有什么帮助吗?
这看起来您正在接受将用作临时查询的一部分的过滤子句,并且您想要尝试验证该查询不会产生“未找到列”错误。这几乎肯定是你不想做的事情,所以我会质疑整体设计......
这种字符串解析在 TSQL 中不会非常有效或漂亮,因此在另一层可能会更好,并且由于您的业务逻辑无疑是将字符串放在一起,所以最好在发生这种情况时进行检查并发现过程早期的任何错误。如果您的业务逻辑没有生成字符串(即您从第 3 方代码或更糟的是用户接受它),那么您将不得不应对字符串中的许多变体(制表符而不是空格,周围没有空格) “=”、额外的空格(包括换行符、使用
[
]
or转义的名称"
"
等)。但是假设你别无选择,因为这是别人的设计,你无权改变它,你可以尝试类似的东西(这里是伪代码,现在还不够懒,现在写详细的 TSQL 字符串操作!):
@LeftToProcess
@LeftToProcess
当(检查)中至少有一个“=”字符时,请charindex
执行以下操作:@ColumnName
@LeftToProcess
TRIM()
@ColumnName
AND
成``在@ColumnName
OR
为 `` in (这两个步骤去掉了逻辑运算符,而不是它们做出了大量假设,例如“如果输入来自用户或第三方,/和名称@ColumnName
之间总是恰好有一个空格字符派对你必须比这聪明得多)AND
OR
sys.objects
joined to检查sys.columns
您的表或视图是否包含现在名称的列@ColumnName
@SomeNotFound
为 1WHILE
循环结束,当我们返回到第 3 步时,我们剥离了刚刚检查过的字符串部分,将找到下一个“=”,或者如果没有更多,我们将转到第 12 步)@SomeNotFound
在循环结束时仍然为0,则所有提及的内容都存在于目标对象中我赶紧说清楚,以防我上面的语气不对,我强烈建议不要做这种事情——很难对所有可能的输入做到绝对正确,如果需要扩展到结果将很难维护处理其他种类的条款。
不太可能有任何明显更清洁或更简单的方法来完全按照您在 TSQL 中的要求进行操作,我觉得您的整体设计需要重新考虑以避免它。