2010-04-20 7 views
2

J'ai des données dans le format suivant:insérer plusieurs lignes dans la table temporaire avec une commande dans SQL2005

-1,-1,-1,-1,701,-1,-1,-1,-1,-1,304,390,403,435,438,439,442,455 

J'ai besoin de l'insérer dans une table temporaire comme ceci:

CREATE TABLE #TEMP 
(
Node int 
) 

Pour que je puisse l'utiliser dans une comparaison avec les données d'une autre table.

Les données ci-dessus représentent des lignes séparées de la colonne "Noeud".

Y at-il un moyen facile d'insérer ces données, le tout en une seule commande?

De plus, les données vont arriver comme vu, sous la forme d'une chaîne ... donc je dois pouvoir simplement les concaténer dans la chaîne de requête SQL. Je peux évidemment le modifier en premier si nécessaire.

+1

Google "fonction de partage de serveur sql" –

Répondre

3

Essayez quelque chose comme

CREATE TABLE #TEMP 
( 
    Node int 
) 


DECLARE @textXML XML 
DECLARE @data NVARCHAR(MAX), 
     @delimiter NVARCHAR(5) 
SELECT @data = '-1,-1,-1,-1,701,-1,-1,-1,-1,-1,304,390,403,435,438,439,442,455 ', 
     @delimiter = ',' 
SELECT @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML) 

INSERT INTO #TEMP 
SELECT T.split.value('.', 'nvarchar(max)') AS data 
FROM @textXML.nodes('/d') T(split) 

SELECT * FROM #TEMP 

DROP TABLE #TEMP 
1

je créerais une fonction qui renvoie une variable de table, puis rejoindre cette fonction dans la sélection

Utilisation:

select * from myTable a 
inner join dbo.buildTableFromCSV('1,2,3') on a.id = b.theData 

Voici ma fonction pour ce faire

CREATE FUNCTION [dbo].[buildTableFromCSV] (@csvString varchar(8000)) RETURNS @myTable TABLE (ID int identity (1,1), theData varchar(100)) 
AS BEGIN 
    DECLARE @startPos  Int   -- position to chop next block of chars from 
    DECLARE @currentPos  Int   -- position to current character we're examining 
    DECLARE @strLen  Int 

    DECLARE @c   char(1)   -- current subString 

    -- variable initalization 
    -- ------------------------------------------------------------------------------------------------------------------------------------------------- 
     SELECT @csvString = @csvString + ',' 
     SELECT @startPos  = 1 
     SELECT @currentPos = 1 



     SELECT @strLen  = Len(@csvString) 




    -- loop over string and build temp table 
    -- ------------------------------------------------------------------------------------------------------------------------------------------------- 

     WHILE @currentPos <= @strLen BEGIN 
      SET @c = SUBSTRING(@csvString, @currentPos, 1)   




      IF (@c = ',' ) BEGIN 


       IF (@currentPos - @startPos > 0) BEGIN 

        INSERT 
        INTO  @myTable (theData) 
        VALUES   ( CAST(SUBSTRING (@csvString, @startPos, @currentPos - @startPos) AS varchar)) 

       END 
       ELSE 
       begin 
        INSERT 
        INTO  @myTable (theData) 
        VALUES   ( null) 

       end 
       SELECT @startPos = @currentPos + 1 

      END 

      SET @currentPos = @currentPos + 1 
     END 

     delete from @myTable where theData is null 

    return 
END 
2

Vous pouvez créer une requête dynamique comme ceci:

declare @sql varchar(1000) 
set @sql = 'insert into #TEMP select ' + replace(@values, ',', ' union all select ') 
exec @sql 

Comme toujours lors de la création de requêtes dynamiquement, vous devez être attentif à ce que vous utilisez uniquement des données fiables.

Questions connexes