【问题标题】:Running 'SET' command in SQL, prior to SELECT在 SELECT 之前在 SQL 中运行“SET”命令
【发布时间】:2016-03-09 23:31:59
【问题描述】:

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 代码,如下所示。 肯定有结果(因为 16 年 2 月 21 日 - 是在星期天,我有匹配的记录) - 但它们没有被显示。事实上,即使通过 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 中...... 我很困扰。感谢所有迄今为止提供帮助的人。

【问题讨论】:

  • 也许是SET NOCOUNT ON;?
  • @Lamak So, SET NOCOUNT ON;SET LANGUAGE German; SELECT...?
  • 好吧,我会试试的,但我不确定它是否有效,这就是为什么我将其发布为评论而不是答案
  • @Lamak - 谢谢,试过了 - 没用
  • 为什么不创建一个存储过程并收工?通过这种方式,您可以设置语言、编号、其他会话变量并在单个“命令”中运行查询而不会出现问题。

标签: sql-server vbscript asp-classic adodb


【解决方案1】:

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

第一个

SET LANGUAGE German;

并不是真正的返回查询,但 Provider 会将其作为封闭的 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 对象将打开但为空。通过验证 BOFEOF 属性是否都是 True 来测试这种情况。如果非行返回命令成功执行,则返回的 Recordset 对象将被关闭,您可以通过测试 Recordset 上的State 属性来验证这一点。当没有更多结果时,记录集将设置为 Nothing。

【讨论】:

  • 感谢 Lankymart 的详细建议。这是我使用您建议的代码时遇到的错误:Object variable not set 指的是DO 行。我不明白关于 SET NOCOUNT ON 的第一个建议 - 有人在上面提出了这个建议,但它对建议的方式没有帮助。
  • @kneidels 这只是一个代码 sn-p,您需要实例化一个 ADODB.Recordset 对象并调用 rs 才能使其工作。我假设您一定已经在您的 ASP/VBScript 代码中的某个地方这样做了?
  • @kneidels 并且这不起作用你仍然得到Object variable not set
  • @kneidels 抱歉没有测试它(伪编码)认为Or应该是And更新了我答案中的代码。
  • 谢谢,改成AND还是报错
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2016-09-24
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多