【发布时间】:2011-08-13 03:29:54
【问题描述】:
基本上,我正在寻找可用于任意 T-SQL 的 SqlCommandBuilder.DeriveParameters 等效项。
例如,这个查询需要一个参数:
SELECT @Foo [Foo], '@Bar' [Bar], @Baz [Baz]
我基本上需要提取:
new[] { "Foo", "Baz" }
从上面。我可以构建一个 SQL 解析器,但我有一个与 SQL 服务器的开放连接,所以如果可能的话,我更愿意使用现有的选项。
编辑:
必须有办法做到这一点,因为 SQL Server 的商业智能开发工作室能够非常成功地做到这一点。
修改 2:
SQL BIDS 正在执行此命令以描述结果:
exec sp_executesql N'SET FMTONLY OFF;SET FMTONLY ON;SELECT @Foo [Foo], ''@Bar'' [Bar], @Baz [Baz]',
N'@Foo sql_variant,@Baz sql_variant',
@Foo=NULL,@Baz=NULL
这解释了它如何确定列,但它可能只是字符串解析以获取参数...
【问题讨论】:
-
你是如何构建这个初始字符串的?有什么可以用来动态构建此字符串以查找所需参数的东西吗?
-
如果您在让 Business Intelligence Development Studio 执行此操作的同时观察服务器,SQL Profiler 是否会显示任何有趣的东西?会告诉我们它是一个服务器函数还是只是字符串解析
-
@Martin;我的天啊!我认为这就是我需要的。请将其发布为答案。
-
@Martin:发布此代码:` var sql = "SELECT @Foo [Foo], '@Bar' [Bar], @Baz [Baz]"; var p = new TSql100Parser(true); var errors = new List
(); var tokens = p.GetTokenStream(new StringReader(sql), errors); if (errors.Count == 0) { var variables = (from t in tokens where t.TokenType == TSqlTokenType.Variable select t.Text).ToArray(); }`
标签: c# .net tsql reflection