2016-03-28 2 views
1

je suis nouveau sur SQL CLR, je vais utiliser pour inverser la table temp géocodage résultatSQL CLR accès à la table temporaire

Scénario prévu sera

  1. procédure stockée qui crée la table temporaire pour rendre compte des résultats
  2. Appelez SQL CLR Fonction qui remplira Datatable à partir des résultats de la table temporaire
  3. Je ferai le géocodage inverse inverse (fonction de géocodage inverse implémentée et fonctionne bien) et remplis les nouvelles colonnes pour l'emplacement à ce Datatable
  4. Retour Datatable comme nouvelle table temporaire à ma procédure stockée donc je vais rejoindre les résultats

Alors, comment accéder à la table Temp de SQL CLR?

Répondre

1

Ceci est un peu confus, mais il semble que vous vouliez lire à partir d'une table temporaire locale (c'est-à-dire #TableName) dans le but de transmettre un ensemble de valeurs. Dans ce cas, vous pouvez SELECT à partir de tables temporaires locales dans des objets SQLCLR si vous utilisez Context Connection = true pour la chaîne de connexion.

S'il s'agit d'une fonction de table (TVF), les lignes du DataTable doivent être renvoyées en tant que jeu de résultats. Bien sûr, vous n'avez pas besoin pour utiliser un DataTable dans les deux sens. Vous pouvez traiter chaque ligne d'entrée et de le transmettre de nouveau comme il est lu, avant la ligne suivante d'entrée est lu:

ResultsStruct _ResultSet = new ResultsStruct(); 

using (SqlConnection _Connection = new SqlConnection("Context Connection = true")) 
{ 
    using (SqlCommand _Command = _Connection.CreateCommand()) 
    { 
    _Command.CommandText = "SELECT Column1, Column2 FROM #ValuesToPassIn;"; 
    _Connection.Open(); 

    using (SqlDataReader _Reader = new _Command.ExecuteReader()) 
    { 
     while(_Reader.Read()) 
     { 
     var1 = _Reader.GetInt32(0); 
     var2 = _Reader.GetInt32(1); 

     ProcessStuff(var1, var2); 

     _ResultSet.SetString(0, something1); 
     _ResultSet.SetSomething(1, something2); 

     yield return _ResultSet; 
     } 
    } 
    } 
} 

La structure générale du T-SQL procédure stockée serait:

CREATE TABLE #ValuesToPassIn 
(
    Column1 DATATYPE, 
    Column2 DATATYPE, 
    ... 
); 

INSERT INTO #ValuesToPassIn (Column1, Column2, ...) 
VALUES (val1a, val2a, ...), (val1b, val2b, ...); 

CREATE TABLE #ValuesComingBack 
(
    ColumnA DATATYPE, 
    ColumnB DATATYPE, 
    ... 
); 

INSERT INTO #ValuesComingBack (ColumnA, ColumnB, ...) 
    SELECT ResultField1, ResultField2, ... 
    FROM dbo.SqlClrTableValuedFunction(); 

Ou, pour passer l'ensemble des valeurs, vous pouvez les envoyer en format XML:

DECLARE @ValuesToPassIn XML; 

SET @ValuesToPassIn = N'<vals>...</vals>'; 

CREATE TABLE #ValuesComingBack 
(
    ColumnA DATATYPE, 
    ColumnB DATATYPE, 
    ... 
); 

INSERT INTO #ValuesComingBack (ColumnA, ColumnB, ...) 
    SELECT ResultField1, ResultField2, ... 
    FROM dbo.SqlClrTableValuedFunction(@ValuesToPassIn); 

pour plus d'informations/détails sur le travail avec SQLCLR, s'il vous plaît voir la série je suis en train d'écrire sur SQL Server Central: Stairway to SQLCLR (veuillez noter: ce site nécessite une inscription gratuite pour lire les articles).

+1

merci pour votre réponse, mais comme vous l'avez dit un peu confus, sonne clairement que vous avez mon problème je vais essayer –

0

Si c'était moi, je l'écrirais comme une fonction de table qui prend (par exemple la latitude et la longitude) et renvoie l'adresse (ou vice versa si j'ai mal compris). Ensuite, vous pouvez l'appeler dans SQL comme ceci:

insert into #t (Address) 
select clr.Address 
from dbo.yourTable 
cross apply dbo.yourCLRFunction(latitude, longitude) as clr 

À ce moment-là, la fonction n'a pas besoin d'avoir accès à la table du tout que toutes les données seront transmises à/par elle.

+0

J'ai besoin de le faire en lot, pour traiter plusieurs lignes en même temps, je pense que votre code va le faire pour chaque ligne séparée –