使用T-SQL从insert,update或delete语句中提取表名

时间:2017-11-22 19:33:00

标签: sql-server tsql

有没有人知道从任何T-SQL插入,更新或删除语句中提取表名的方法?例如,给定此语句(以简单字符串的形式):

'Update MyTable Set MyColumn = 10 Where Column1 = 4'

' MyTable的'将被退回。

该方法还必须考虑更复杂的Update语句,例如:

'Update T Set T.MyColumn = 4
From MyTable T
   Inner Join ...
...'

SQL语句将采用字符串的形式,此过程将解析字符串并返回表名。

我正在寻找的东西与sp_describe_first_result_set类似,当然,sp_describe_first_result_set仅适用于Select语句。我只需要表名。

1 个答案:

答案 0 :(得分:2)

我可以使用一些看起来很糟糕的字符串解析(包含示例数据,以防其他人可以做得更好)。你应该能够在SSMS中运行它:

DECLARE @sql TABLE(ID INT IDENTITY(1,1) PRIMARY KEY, SQLString VARCHAR(255))
INSERT INTO @sql
        ( SQLString )
VALUES  ('Update MyTable Set MyColumn = 10 Where Column1 = 4')
    , ('Update T Set T.MyColumn = 4 From MyOtherTable T    Inner Join MyOtherTable O    ON t.id = o.id;') 
    , ('SELECT * FROM Triskaidekaphobia WHERE [foo] = ''bar'';')

SELECT SQLString
    , FirstTableName = 
        CASE WHEN CHARINDEX('FROM', SQLString) > 0
            THEN 
                SUBSTRING(
                    SQLString, --expression
                    CHARINDEX('FROM ', SQLString) + 5, --start
                    CHARINDEX(' ', SUBSTRING(SQLString, CHARINDEX('FROM ', SQLString) + 5, 255))-1 --length
                )
            ELSE 
                SUBSTRING(
                    SQLString, 
                    CHARINDEX('UPDATE ', SQLString) + 7, 
                    CHARINDEX(' ', SUBSTRING(SQLString, CHARINDEX('UPDATE ', SQLString) + 7, 255))-1
                )
        END
FROM @sql