运行 'SET' 命令之前,选择

问题描述:

this question,我需要我的SELECT查询之前,像运行 'SET' 命令之前,选择

SET LANGUAGE German; 

补充一下。 我在ASP/VBScript网络环境中运行查询,这基本上限制了我一次只查询一次查询。 如果我运行一个查询,如 -

SET LANGUAGE German; SELECT..... 

我得到一个没有结果的消息,因为“数据”返回距离SET查询,而不是它后面的SELECT

在ASP/VBScript环境下可以做什么来将SETSELECT一起运行?

UPDATE: 按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)的语言设置。

ALSO: 我试图让一个存储过程,因为这样的:

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 ... 我很困惑。感谢迄今为止帮助过的所有人。

+0

也许'SET NOCOUNT ON;'? – Lamak

+0

@Lamak所以,'SET NOCOUNT ON; SET LANGUAGE German; SELECT ...'? – kneidels

+0

好吧,我会尝试一下,我不确定它是否可以正常工作,这就是为什么我将它发布为评论而不是答案 – Lamak

这是一种误解。 ASP/VBScript都不限制你,这个限制是由ADODB用来执行命令的。就SQL Server而言,尽管在执行包含多个查询的命令时没有限制(我知道)

首先

SET LANGUAGE German; 

是不是一个真正的返回查询,但该供应商将返回它作为一个封闭的ADODB.Recordset对象,这是不理想,但有一个简单的解决。

SET NOCOUNT ON; 

将被发送到说执行线是成功的,其是由ADODB解释为一个封闭的ADODB.Recordset对象抑制DONE_IN_PROC消息。

另一种方式来解决这个问题,但不是直线前进的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对象不是处于关闭状态。

From MSDN - NextRecordset Method (ADO)

As long as there are additional results and the Recordset containing the compound statements is not disconnected or marshaled across process boundaries, the NextRecordset method will continue to return Recordset objects. If a row-returning command executes successfully but returns no records, the returned Recordset object will be open but empty. Test for this case by verifying that the BOF and EOF properties are both True. If a non–row-returning command executes successfully, the returned Recordset object will be closed, which you can verify by testing the State property on the Recordset. When there are no more results, recordset will be set to Nothing.

+0

感谢Lankymart的详细建议。这是我使用你所建议的代码的错误:'引用'DO'行的'Object variable not set'。 我不明白关于'SET NOCOUNT ON'的第一个建议 - 有人提出了上面的建议,而且它没有按照建议的方式提供帮助。 – kneidels

+0

@kneidels这只是一个代码片段,你需要有一个'ADODB.Recordset'对象实例化并调用'rs'才能工作。我认为你必须已经在你的ASP/VBScript代码中的某个地方做了这些事情? – Lankymart

+0

@kneidels,是不工作,你仍然得到'对象变量未设置'? – Lankymart