2017-01-12 3 views
0

Я пытаюсь запросить экземпляр SQL Server 2008 из VBScript. Я знаю, что мое соединение работает, потому что, когда я использую простой запрос, такой как один ниже, он отлично работает.Создание временной таблицы в SQL Server 2008 от VBScript

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

Единственное, что я не уверен в том, что пользователь, с которым я связан, имеет права на чтение. Не уверен, что userid сможет создавать временные таблицы, если они только для чтения. Я выполнил тот же запрос от 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', пока не найдете набор записей, соответствующий выполнению' SELECT' в вашем SQL. – Lankymart

ответ

1

разрешаемые комментарий по Lankymart. Резолюция должна была добавить SET NOCOUNT ON в начало моего запроса.