T-SQL解析字符串和执行操作

时间:2011-06-29 19:58:16

标签: sql sql-server tsql sql-server-2008

我正在探索基于字符串输入动态计算值的选项。以下面的字符串输入为例。

"(32+35)/(12+34)"

数字32,35,12和34是ID的“占位符”。在口语中,我想要做的是如下。获取ID为32的度量标准并为其应用一些返回值的函数。然后将该值添加到应用于度量标准ID 35的相同函数返回的值,依此类推。

(dbo.foo(32) + dbo.foo(35)) / (dbo.foo(12) + dbo.foo(34))

从一个简单的加法字符串开始可能更容易,并且可以使用其他运算符( - ,/,*)。

这在tsql中可能吗?打开正则表达式选项(有一个正则表达式tsql函数)和你能想到的任何其他东西。

也许正则表达式替换整数以将函数名称插入到字符串中会起作用然后exec()字符串来获得结果?

我们不要争论这种方法的优点/缺点......我知道这不是我的问题的真正“数据库”解决方案,但想要更多地探索它。

2 个答案:

答案 0 :(得分:2)

我能够使用我提到的正则表达式选项将其作为概念证明。

    declare @str as nvarchar(1000)
    declare @regex as nvarchar(1000)

    set @str = '(32+33)/(12+93)'
    set @regex = 'select ' + dbo.regex_replace('\d+','dbo.foo($&)', @str, 1, 0)

    exec(@regex)

我的regex_replace函数接受参数(@pattern,@ replacement,@ subject,@ global,@ multiline)。我通过谷歌找到了这个功能。如果您正在搜索它是“RegexReplace”我相信。

此代码提供了我正在寻找的答案。

答案 1 :(得分:1)

RegEx相当优雅。但部分是因为不是每个人都有RegEx可用,部分是因为我已经完成了所有的工作,这里是一个直接的T-SQL解决方案(不是最强大,最可怕的变量名称,但它完成了工作)。请注意,它假设整数 - 如果你在那里抛出小数,你也必须检查它们。

DECLARE 
    @foo NVARCHAR(MAX) = N'(32+35)/(12+34)', 
    @bar NVARCHAR(MAX) = N'';

DECLARE 
    @i INT = 0, 
    @z INT = LEN(@foo), 
    @y INT, 
    @s NVARCHAR(12),
    @s2 NVARCHAR(12);

WHILE @i <= @z
BEGIN
    SET @s = SUBSTRING(@foo, @i, 1);
    IF ASCII(@s) BETWEEN 48 AND 57
    BEGIN
        SET @bar += 'dbo.foo(';
        SET @y = @i + 1;
        WHILE @y <= @z
        BEGIN
            SET @s2 = SUBSTRING(@foo, @y, 1);
            IF ASCII(@s2) BETWEEN 48 AND 57
            BEGIN
                SET @s += @s2;
                SET @y += 1;
            END
            ELSE
            BEGIN
                BREAK
            END
        END
        SET @s += ')';
        SET @i = @y - 1;
    END
    SET @bar += @s;
    SET @i += 1;
END

PRINT @bar;

--EXEC('SELECT ' + @bar);