2017-01-12 24 views
0

我想从VBScript中查询SQL Server 2008实例。 我知道我的连接正在工作,因为当我使用一个简单的查询,如下面的它可以正常工作。从VBScript在SQL Server 2008中创建临时表

sfQuery2 = "SELECT TOP 10 * FROM [DB].[schema].[table]" 

我不确定的一件事是我连接的用户只读权限。不确定用户标识是否能够创建临时表(如果它们是只读的)。我用这个用户从SQL Server运行了相同的查询,并且查询工作。但是,当我尝试当我尝试读取记录集,我得到的是错误与VBScript中的同一个用户运行此.....

ADODB.Recordset:操作对象时关闭不允许。

sfQuery2 = "CREATE TABLE #Temp1 ([LOGNAME] [nvarchar](20) NULL, [MESSAGE_TYPE] [int] NULL, [COMPONENT] [nvarchar](50) NULL, [LOGTIME] [nvarchar](17) NOT NULL, [SUB_SYSTEM] [nvarchar](40) NULL, [STACK_ID] [nvarchar](120) NULL, [SUBSTACK_ID] [int] NULL, [MESSAGE] [nvarchar](1800) NULL, [DETAIL] [nvarchar](1800) NULL) INSERT INTO #Temp1 SELECT DISTINCT [LOGNAME], [MESSAGE_TYPE],     [COMPONENT], LOGTIME,    [SUB_SYSTEM], [STACK_ID],    [SUBSTACK_ID], [MESSAGE],    [DETAIL]    FROM [DB].[schema].[table] WHERE cast(LEFT(LOGTIME,8) as date) = cast(getdate() -1 as date) AND [MESSAGE] LIKE '%Exporter->Archive' CREATE TABLE #Temp2 ([LOGNAME] [nvarchar](20) NULL, [MESSAGE_TYPE] [int] NULL, [COMPONENT] [nvarchar](50) NULL, [LOGTIME] [nvarchar](17) NOT NULL, [SUB_SYSTEM] [nvarchar](40) NULL, [STACK_ID] [nvarchar](120) NULL, [SUBSTACK_ID] [int] NULL, [MESSAGE] [nvarchar](1800) NULL, [DETAIL] [nvarchar](1800) NULL) INSERT INTO #Temp2 SELECT DISTINCT [LOGNAME], [MESSAGE_TYPE],     [COMPONENT],cast(LEFT(LOGTIME,8) as date) AS YesterdayDate,     [SUB_SYSTEM], [STACK_ID],    [SUBSTACK_ID], [MESSAGE],    [DETAIL]    FROM [DB].[schema].[table] WHERE cast(LEFT(LOGTIME,8) as date) = cast(getdate() -1 as date) AND [DETAIL] LIKE 'USER:%' SELECT * FROM ( SELECT RIGHT(b.DETAIL, 7) AS AXAID, cast(LEFT(a.LOGTIME,8) as date) AS [DATE], b.STACK_ID, ROW_NUMBER() OVER(PARTITION by b.STACK_ID ORDER BY a.LOGTIME DESC) rn FROM #Temp1 AS a INNER JOIN #Temp2 AS b ON a.STACK_ID = b.STACK_ID WHERE a.[MESSAGE] LIKE '%Exporter->Archive' ) a WHERE rn = 1 " 
oSfRs.Open sfQuery2, oSfCn 

if osfrs.BOF then 
Debug "There are NO results" 
else 
Debug "There is data in the Record Set" 
end if 

我不知道这是否是一个语法错误与我的SQL或者是否有可能是因为用户的权利。任何帮助将不胜感激。 如果需要更多信息,请让我知道。


对于那些挣扎在这里阅读的SQL是一种格式化版本

CREATE TABLE #Temp1 (
    [LOGNAME] [nvarchar](20) NULL, 
    [MESSAGE_TYPE] [int] NULL, 
    [COMPONENT] [nvarchar](50) NULL,  
    [LOGTIME] [nvarchar](17) NOT NULL, 
    [SUB_SYSTEM] [nvarchar](40) NULL, 
    [STACK_ID] [nvarchar](120) NULL,  
    [SUBSTACK_ID] [int] NULL, 
    [MESSAGE] [nvarchar](1800) NULL,  
    [DETAIL] [nvarchar](1800) NULL 
) 

INSERT INTO #Temp1 
SELECT DISTINCT [LOGNAME], [MESSAGE_TYPE], [COMPONENT], LOGTIME, [SUB_SYSTEM] 
, [STACK_ID], [SUBSTACK_ID], [MESSAGE], [DETAIL] 
FROM [DB].[schema].[table] 
WHERE cast(LEFT(LOGTIME,8) as date) = cast(getdate() -1 as date)  
AND [MESSAGE] LIKE '%Exporter->Archive' 

CREATE TABLE #Temp2 (
    [LOGNAME] [nvarchar](20) NULL,  
    [MESSAGE_TYPE] [int] NULL, 
    [COMPONENT] [nvarchar](50) NULL,  
    [LOGTIME] [nvarchar](17) NOT NULL, 
    [SUB_SYSTEM] [nvarchar](40) NULL, 
    [STACK_ID] [nvarchar](120) NULL,  
    [SUBSTACK_ID] [int] NULL, 
    [MESSAGE] [nvarchar](1800) NULL,  
    [DETAIL] [nvarchar](1800) NULL 
) 

INSERT INTO #Temp2 SELECT DISTINCT [LOGNAME], [MESSAGE_TYPE], [COMPONENT] 
, cast(LEFT(LOGTIME,8) as date) AS YesterdayDate 
, [SUB_SYSTEM], [STACK_ID], [SUBSTACK_ID], [MESSAGE], [DETAIL] 
FROM [DB].[schema].[table] 
WHERE cast(LEFT(LOGTIME,8) as date) = cast(getdate() -1 as date)  
AND [DETAIL] LIKE 'USER:%' 

SELECT * 
FROM ( 
    SELECT RIGHT(b.DETAIL, 7) AS AXAID, cast(LEFT(a.LOGTIME,8) as date) AS [DATE] 
    , b.STACK_ID, ROW_NUMBER() OVER(PARTITION by b.STACK_ID ORDER BY a.LOGTIME DESC) rn 
    FROM #Temp1 AS a  
    INNER JOIN #Temp2 AS b ON a.STACK_ID = b.STACK_ID 
    WHERE a.[MESSAGE] LIKE '%Exporter->Archive'  
) a WHERE rn = 1 
+0

你真的在应用程序中直接在单行上直接写入那么多的sql吗?这是不可能破译的。这里的错误信息很清楚。它与sql权限无关,它与你的对象有关。我的猜测是你永远不会打开你的数据库连接。 –

+1

你应该将这个SQL封装到一个存储过程中,像这样管理它将是一场噩梦。 – Lankymart

+1

问题在于缺少SET NOCOUNT ON;因此所有的INSERT语句都会产生空的关闭记录集。在没有SET NOCOUNT ON的情况下,您必须一直调用Set oSfRs = oSfRs.NextRecordset,直到找到与SQL中的SELECT执行对应的记录集。 – Lankymart

回答

1

通过Lankymart通过评论解决。 解决方案是将SET NOCOUNT ON添加到我的查询的开头。