关注this question,我需要添加类似
的内容SET LANGUAGE German;
在我的SELECT
查询之前。 我在ASP / VBScript Web环境中运行查询,据我所知,这基本上限制了我一次只能查询一个查询。 如果我运行查询,如 -
SET LANGUAGE German; SELECT.....
我收到了无结果消息,因为'数据'返回来自SET
查询,而不是其后的SELECT
。
在ASP / VBScript环境中,是否可以一起运行SET
和SELECT
?
更新: 根据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内... 我很迷茫。感谢所有迄今为止帮助过的人。
答案 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 对象将打开但为空。通过验证BOF和EOF属性是否为 True 来测试此案例。如果成功执行非行返回命令,则将关闭返回的 Recordset 对象,您可以通过测试 Recordset 上的State属性来验证该对象。当没有更多结果时,记录集将设置为Nothing。