跑步'设置' SQL中的命令,在SELECT

时间:2016-03-08 13:46:06

标签: sql-server vbscript asp-classic adodb

关注this question,我需要添加类似

的内容
SET LANGUAGE German;
在我的SELECT查询之前

。 我在ASP / VBScript Web环境中运行查询,据我所知,这基本上限制了我一次只能查询一个查询。 如果我运行查询,如 -

SET LANGUAGE German; SELECT.....

我收到了无结果消息,因为'数据'返回来自SET查询,而不是其后的SELECT

在ASP / VBScript环境中,是否可以一起运行SETSELECT

更新: 根据Lankymarts的建议:

set rs = SERVER.CreateObject("ADODB.recordset")
rs.open sql, conn, 1, 2

Do While (rs.State = 0 Or rs Is Not Nothing)  // also tried: Do While (rs.State = 0 AND rs Is Not Nothing) 
 Set rs = rs.NextRecordset
Loop

do while not rs.eof
  response.write ...

更新2:
既然已经解决了已关闭的记录集问题,我仍然没有从主记录集中获取行。 这是我的VBScript代码,如下所示。 肯定会有结果(因为21 / feb / 16 - 星期天,我有相应的记录) - 但它们没有显示。事实上即使通过SSMS显示,有时我也不会得到结果 - 也许它会与语言变化混淆?

    sql = " SET LANGUAGE German; "
    sql = sql & " SELECT [tblstudentrakazot].studentid, firstname, lastname, tblRakezetSchedule.* FROM tblRakezetSchedule"
    sql = sql & " INNER join [tblstudentrakazot] on [tblstudentrakazot].scheduleID = tblRakezetSchedule.scheduleid "
    sql = sql & " INNER join tblstudents on [tblstudentrakazot].studentid = tblstudents.studentid"
    sql = sql & " WHERE CONVERT(int,scheduleday) = datepart(d,convert(datetime,'" & cleanSQL(planneddate) & "',103)) AND "
    sql = sql & " tblRakezetSchedule.rakezetID = " & CleanSQL(x_rakezetID)
    sql = sql & " ORDER BY replace(scheduletimefrom, ':', '')"

    response.Write("### " & sql)
    set rs = SERVER.CreateObject("ADODB.recordset")
    rs.open sql, conn, 1, 2

    Do While rs.State = 0 And Not rs Is Nothing
     Set rs = rs.NextRecordset
    loop 


    do while not rs.eof 
       ' we now proceed to loop through the actual result recordset : studentid, firstname etc... 

顺便说一下 - 在查询运行后,语言是否保留在德语中,还是恢复为默认语言?

我想我需要的是一种语言设置,其默认值为dd / mm / yyyy(因为系统中存在其他遗留要求),而DATEFIRST是星期日(1)。

同时 我试图制作一个存储过程,如下:

    ALTER PROCEDURE [dbo].[procListRakezetSlotsByDay] @planneddate nvarchar(10),  @rakezetID int

    AS
    BEGIN

        SET NOCOUNT ON;
        SET LANGUAGE German;

    SELECT [tblstudentrakazot].studentid, firstname, lastname, tblRakezetSchedule.* FROM tblRakezetSchedule
    INNER join [tblstudentrakazot] on [tblstudentrakazot].scheduleID = tblRakezetSchedule.scheduleid 
    INNER join tblstudents on [tblstudentrakazot].studentid = tblstudents.studentid
    WHERE CONVERT(int,scheduleday) = datepart(d,convert(datetime,@planneddate,103)) AND tblRakezetSchedule.rakezetID = @rakezetID
    ORDER BY replace(scheduletimefrom, ':', '')


    END

然后运行它:

    DECLARE @return_value int

    EXEC    @return_value = [dbo].[procListRakezetSlotsByDay]
            @planneddate = N'28/2/2016',
            @rakezetID = 182

    SELECT  'Return Value' = @return_value

    GO

并且在这里也没有返回任何结果 - 即使在SSMS内... 我很迷茫。感谢所有迄今为止帮助过的人。

1 个答案:

答案 0 :(得分:2)

这是一种误解。 ASP / VBScript都没有限制您,限制是由ADODB用于执行命令的提供程序强加的。在SQL Server方面,虽然在执行包含多个查询的命令时没有限制(我知道)

首先

SET LANGUAGE German;

并不是一个真正的返回查询,但提供商会将其作为已关闭的ADODB.Recordset对象返回,这不是理想的,但有一个简单的修复。

SET NOCOUNT ON;

将禁止发送DONE_IN_PROC消息,表示执行行成功,ADODB将其解释为已关闭的ADODB.Recordset对象。

另一种处理此问题但不像SET NOCOUNT ON那样直截了当的方法是使用ADODB.Recordset对象的NextRecordSet()方法逐步执行各种结果集,直到找到实际值查询结果。

假设rs是我们的起始ADODB.Recordset对象

Do While (rs.State = adStateClosed And Not rs Is Nothing)
 Set rs = rs.NextRecordset
Loop

将返回处于关闭状态的第一个ADODB.Recordset对象。

  

来自MSDN - NextRecordset Method (ADO)

     

只要有其他结果且包含复合语句的 Recordset 未跨进程边界断开连接或封送, NextRecordset 方法将继续返回 Recordset 对象。如果行返回命令成功执行但未返回任何记录,则返回的 Recordset 对象将打开但为空。通过验证BOFEOF属性是否为 True 来测试此案例。如果成功执行非行返回命令,则将关闭返回的 Recordset 对象,您可以通过测试 Recordset 上的State属性来验证该对象。当没有更多结果时,记录集将设置为Nothing。