【问题标题】:Using sp_helptext in classic asp在经典 asp 中使用 sp_helptext
【发布时间】:2015-06-01 22:23:36
【问题描述】:

当我想获得stored procedure 的定义(在 SQL Server 中)时,我使用 SQL Server Management Studio。

我有时会运行“sp_helptext”来输出存储过程的定义。
链接:https://msdn.microsoft.com/en-us/library/ms176112.aspx

简而言之,我想要一个简单的 html 弹出窗口,它将任何存储过程的定义输出到文本。

下面的 asp 代码成功连接到我的数据库,但我没有得到任何输出。

<% 
' .......
sql = "exec sp_helptext 'some_ProcName_Here'"
objRs.open sql, objConn
Text=objRs("Text")
response.write(Text) 
%>

我还尝试创建一个带有 1 个参数的新存储过程,它将执行 sp_helptext

<% 
' .......
sql = "exec See_Proc_Definition @ProcName=some_ProcName_Here"
objRs.open sql, objConn
Text=objRs("Text")
response.write(Text) 
%>

这些都没有显示任何内容,但我也没有收到任何返回的错误。 谁能看到我做错了什么?

【问题讨论】:

  • 这里的问题是sp_helptext 每行生成一行,因此您需要Do While Not objRs.EOF 并使用objRs.MoveNext 将光标移动到每一行。我的猜测是您尝试显示的定义包含一个空白的第一行。
  • 如果这是真的,那么第一行应该显示? OP 说没有显示?
  • 这是一个存储过程,但它被调用就像是一个查询
  • @WhirlMind 定义必须包含一个空行。
  • @Mackan True,但这是完全可行的,尽管我个人会使用 ADODB.Command 来执行它。

标签: sql-server stored-procedures asp-classic


【解决方案1】:

问题是您只显示sp_HelpText 输出的第一行。 SQL Server 将输出作为单列记录集返回,其中包含一个名为 [Text] 的列。

这意味着您需要遍历行以显示其余的输出。

使用您的第一个示例;

<% 
' .......
sql = "exec sp_helptext 'some_ProcName_Here'"
objRs.open sql, objConn
Do While Not objRs.EOF
  Text=objRs("Text")
  response.write(Text)
  objRS.MoveNext
Loop
%>

根据经验,这并不理想,但会起作用(尤其是对于更复杂的存储过程)我发现从长远来看,这样的事情会更好;

Dim sql, cmd, rs, data

Set cmd = Server.CreateObject("ADODB.Command")
sql = "sp_HelpText"
With cmd
  'Use your connection string instead of instantiating an ADODB.Connection object.
  .ActiveConnection = conn_string
  .CommandType = adCmdStoredProc
  .CommandText = sql
  .Parameters.Append(.CreateParameter("@objname", adVarWChar, adParamInput, 776))
  .Parameters.Append(.CreateParameter("@columnname", adVarWChar, adParamInput, 128))
  Set rs = .Execute(, Array("some_ProcName_Here"))
  If Not rs.EOF Then data = rs.GetRows()
  Call rs.Close()
  Set rs = Nothing
End With
Set cmd = Nothing

此方法为您提供了一个二维数组,其中包含data 变量中的行数据。然后,您可以使用标准 Array 技术来操作输出。

Dim output, row, rows

If IsArray(data) Then
  rows = UBound(data, 2)
  For row = 0 To rows
    output = output & "<br />" & data(0, row)
  Next
  Call Response.Write(output)
End If

链接

【讨论】:

  • OP 提及,没有显示?
  • @WhirlMind 据 OP 可以判断没有显示输出,这并不意味着代码不起作用,它只是意味着输出中的第一行是空白的。
  • Command 的加分项;)Execute(, Array("some_ProcName_Here")) 对我来说也是新闻。
  • @Mackan 我稍微谈谈这种方法here。直到几年前,Array() 方法才适用于我。
  • 感谢您的链接。我还检查了 msdn,现在我想知道为什么我在过去 +10 年的经典 asp 编码中没有使用任何这些 Execute 参数;)其中一些会节省一些时间确定(受影响的记录等)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多