2017-08-29 11 views
1

J'ai une feuille Excel avec une colonne nommée sqlQueries. Chaque cellule a un ensemble de requêtes à exécuter.Comment exécuter plusieurs requêtes en qtp en une seule fois à l'aide d'un seul objet

Je suis en mesure d'exécuter des requêtes sumple utilisant qtp Mais les cellules qui ont de multiples déclarations comme par exemple dans la cellule (x, 6) la requête ci-dessous présente: " utilisation LDatabase Exec sp_DropObjectIfExists « #temptable »; Sélectionner col1 dans #temptable de maintable; Update #temptable réglé ColV = 5 comptage de sélection (1) totalCount de #temptable "

ci-dessus est juste un exemple et pas la requête SQL exacte. Cet ensemble complet se trouve dans une seule cellule de feuille Excel. Je veux que cela soit exécuté en utilisant Qtp.

Actuellement, ce que je fais en qtp est:

Set objconnection = CreateObject("ADODB.Connection") 
objconnection.open"provider=blah blah blah" 
Set objrecordset= CreateObject("ADODB.Recordset") 
ws.cells(x,6).select ''''the above sql queries set is in this cell 
Sqlquery1= ws.cells(x,6).value 
objrecordset.Open Sqlquery1. objconnection 
Value1=objrecordset.Fields.Item(0) 

Pour la dernière ligne ci-dessus, je reçois une erreur disant « Les produits ne peuvent pas être trouvés dans la collection correspondant au requestef nom ou ordinale »

Je suppose que c'est parce qu'il y a plusieurs instructions dans une seule cellule qui doivent être excitées mais seulement la première ligne qui est "use LDatabase" est en cours d'exécution. Et pas tout le contenu de la cellule.

Pourriez-vous s'il vous plaît m'aider à exécuter le tout en un seul coup.

Merci!

+0

'Sqlquery1. objconnection' devrait lire 'Sqlquery1, objconnection'. Est-ce que les requêtes de chaque cellule renvoient toujours une table? Si oui, est-ce toujours une table? –

+0

Oui. Chaque ensemble de requêtes dans une cellule renvoie une table. – Neha

+0

[Recommandé par Microsoft] (https://support.microsoft.com/fr-fr/help/235340/prb-erreur-messaging-referencing-temp-table-avec-ado-sqloledb) vous ajoutez SET NOCOUNT ON à des requêtes contenant des tables temporaires. Cela vous permettra également d'inclure des instructions de déclaration (exemple: 'DECLARE @MyVar INT = 5;'). –

Répondre

0

Préfixez vos requêtes avec SET NOCOUNT ON;. Cela vous permettra d'utiliser temp tables et des variables dans vos instructions SQL.

Le code ci-dessous le montre. J'ai utilisé early binding pour faciliter la lecture du code (Outils >>Références >>Microsoft ActiveX Data Objects 2.8 Bibliothèque).

Alterner entre ces lignes à tester:

  • rs.Open QueryA, cn, adOpenForwardOnly, adLockReadOnly
  • rs.Open QueryB, cn, adOpenForwardOnly, adLockReadOnly

QueryA échouera. QueryB renverra Jack.

' Demo of using SET NOCOUNT ON;. 
' This option enabled the use of SQL vars and temp tables. 
Sub Test() 
    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set cn = New ADODB.Connection 
    Set rs = New ADODB.Recordset 

    cn.Open "Driver={SQL Server};Server=YOUR-SEVER-NAME-HERE;Database=master;Trusted_Connection=Yes;" 

    ' QueryA fails, while QueryB does not. 
    ' Switch which line is commented out to test. 
    rs.Open QueryA, cn, adOpenForwardOnly, adLockReadOnly 
    'rs.Open QueryB, cn, adOpenForwardOnly, adLockReadOnly 

    ' This line will raise an error with QueryA. 
    ' This line will work with QueryB. 
    MsgBox rs.Fields(1).Value 

    rs.Close 
    cn.Close 
End Sub 

' Returns a sample query without NOCOUNT. 
Public Function QueryA() As String 

    QueryA = "    CREATE TABLE #ExampleA    " 
    QueryA = QueryA & "  (         " 
    QueryA = QueryA & "   Id  INT PRIMARY KEY,  " 
    QueryA = QueryA & "   Name VARCHAR(50) NOT NULL " 
    QueryA = QueryA & " );         " 
    QueryA = QueryA & "" 
    QueryA = QueryA & "  INSERT INTO #ExampleA (Id, Name) " 
    QueryA = QueryA & "  VALUES        " 
    QueryA = QueryA & "   (1, 'Jack'),     " 
    QueryA = QueryA & "   (2, 'Jill')      " 
    QueryA = QueryA & "  ;         " 
    QueryA = QueryA & "" 
    QueryA = QueryA & "  SELECT * FROM #ExampleA    " 
End Function 

' Returns a sample query with NOCOUNT. 
Public Function QueryB() As String 

    QueryB = "    SET NOCOUNT ON;      " 
    QueryB = QueryB & "" 
    QueryB = QueryB & "  CREATE TABLE #ExampleA    " 
    QueryB = QueryB & "  (         " 
    QueryB = QueryB & "   Id  INT PRIMARY KEY,  " 
    QueryB = QueryB & "   Name VARCHAR(50) NOT NULL " 
    QueryB = QueryB & " );         " 
    QueryB = QueryB & "" 
    QueryB = QueryB & "  INSERT INTO #ExampleA (Id, Name) " 
    QueryB = QueryB & "  VALUES        " 
    QueryB = QueryB & "   (1, 'Jack'),     " 
    QueryB = QueryB & "   (2, 'Jill')      " 
    QueryB = QueryB & "  ;         " 
    QueryB = QueryB & "" 
    QueryB = QueryB & "  SELECT * FROM #ExampleA    " 
End Function 

J'ai incorporé les deux versions de ma requête dans quelques fonctions, moche. Ils sont difficiles à lire mais faciles à partager. Voici une version propre de la requête de travail. Supprimer la première ligne pour la variante non-travail.

SET NOCOUNT ON; 

CREATE TABLE #ExampleA    
(         
    Id  INT PRIMARY KEY,   
    Name VARCHAR(50) NOT NULL  
);         

INSERT INTO #ExampleA (Id, Name)  
VALUES        
    (1, 'Jack'),      
    (2, 'Jill')      
;         

SELECT * FROM #ExampleA;