【发布时间】:2013-03-25 21:01:45
【问题描述】:
我正在尝试解析数百个存储过程,以专门获取它们的输出变量“@FirstName”、它们使用哪些表以及它们从“MyTbl.FirstName”中提取哪些字段。我能够很容易地收集变量,但我在收集表名时遇到了麻烦。有人可以帮忙吗?
到目前为止,我已经能够通过使用 StreamReader 解析 SQL 文件并逐行收集信息来提取这些字段中的大部分,例如,如果一行包含输出,那么我知道该行中的第一个文本是很可能是@Variable。
@Address1 varchar(45) output,
@Address2 varchar(45) output,
@City varchar(35) output,
@State varchar(2) output,
@Zip varchar(10) output
从那里我可以将@Variable 存储到字典中,如果任何行包含@Variable 并且还包含“=”,那么我知道我们匹配到它对应的字段。
@Address1 = c.Address,
@Address2 = c.AddressSecondLine,
@City = c.City,
@State = c.State,
@Zip = c.ZipOrPostalCode
现在我只是在收集表名时遇到问题。我可以轻松地从字段名称中解析表别名,但在将别名与表名匹配时遇到问题。有谁知道这样做的好方法?到目前为止,这是我一直在尝试的:
FROM Table.dbo.SalesStuff ss
LEFT OUTER JOIN Table.dbo.Customer c ON ss.CustNo = c.CustNo
Left JOIN Table.dbo.Vending v on @tmpVin = v.vin
代码:
keyColl = tables.Keys;
foreach (string var in keyColl)
{
if (line.Contains(" " + var + '\r') || line.Contains(" " + var + " ") || line.Contains(" " + var + ((char)13)) || line.Contains(" " + var + Environment.NewLine))
{
tables[var] = line.ToString();
break;
}
}
我认为这将匹配表别名,因为大多数别名都是一个字母,后跟一个换行符,但到目前为止我还没有得到任何表名......有人知道吗?
【问题讨论】:
-
如果不知道
keyColl或line中的实际内容,甚至不知道您在哪里遍历查询行,就很难判断。你的调试器认为你在比较什么? -
遗憾的是,我认为在每个查询中依赖单字母别名后跟回车是不安全的...
标签: c# sql-server-2005 stored-procedures text-parsing sql-parser