有没有人知道从任何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语句。我只需要表名。
答案 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