2014-09-18 1 views
0

J'utilise SQL Server.Procédure stockée qui met à jour des champs avec des valeurs différentes

Je dois créer une procédure stockée qui mettra à jour le champ de données (tableau ci-dessous) avec une valeur différente pour chaque valeur d'ID. (les valeurs dans les champs de données dépendent de l'entrée de l'utilisateur).

ID | Data 
--------- 
1  | NULL 

2  | NULL 

3  | NULL 

Par exemple: si ID = 1, les données doivent être "Test1"

L'ID et les paires de données devrait être en quelque sorte les paramètres d'entrée aux procédures stockées.

Est-ce possible, ou dois-je appeler une procédure de mise à jour simple pour chaque paire ID/Données?

Répondre

2

Vous devez utiliser XML pour envoyer des données pour plusieurs lignes. Pour votre problème actuel, préparez (générez dynamiquement) un fichier XML comme ci-dessous.

'<NewDataSet><Table><Id>1</Id><Data>test1</Data></Table><Table><Id>2</Id><Data>test2</Data></Table></NewDataSet>' 

Puis Préparez une procédure comme ci-dessous.

CREATE PROC [dbo].[UpdateMultipleRecords]  
(    
@XmlString VARCHAR(MAX) 
)    
AS      
BEGIN  
SET NOCOUNT ON;  



CREATE TABLE #DATA  
(    
Id int,  
Data varchar(50) NULL 

)  

DECLARE @DocHandle int  
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @XmlString  

INSERT INTO #DATA  
SELECT Id,Data 
FROM OPENXML (@DocHandle, '/NewDataSet/Table',2)  
WITH  
(     
Id int,  
Data varchar(50) 
)  
    EXEC sp_xml_removedocument @DocHandle     

UPDATE [dbo].[Table1] SET DATA=D.Data 
FROM [dbo].[Table1] T INNER JOIN #DATA D ON T.ID=D.Id 

IF (SELECT OBJECT_ID('TEMPDB..#DATA')) IS NOT NULL DROP TABLE #DATA  

END 

Et appelez la procédure

[UpdateMultipleRecords] '<NewDataSet><Table><Id>1</Id><Data>Test1</Data></Table><Table><Id>2</Id><Data>Test2</Data></Table></NewDataSet>' 
0

Vous pouvez utiliser une autre table avec vos valeurs comme source pour la mise à jour

update t 
set 
Data = src.Data 
from tableDestination t 
inner join sourceTable src on 
    t.ID = src.ID 
+0

Les données sont dynamiques (dépend de l'entrée utilisateur). Donc, si j'utilise une autre table, j'ai besoin d'insérer toutes les données dans cette table temporaire, et de mettre à jour la table d'origine. Est-ce votre idée? – Programmer

+0

@Programmer Voulez-vous que la procédure stockée mette à jour la valeur de la colonne de données en fonction de l'ID? –

+0

Oui, mais j'ai besoin de plusieurs mises à jour dans la même procédure stockée. En outre, le nombre de mises à jour est dynamique. Par exemple, les paramètres d'entrée dans la procédure stockée peuvent être: 1, Test; 2, Test2. Ou il peut être: 3, Test; 5, Test1; 7, Test6. – Programmer

1

Vous devez types de table définis par l'utilisateur pour cela:

Essayez ceci:

-- test table 
create table yourtable(id int not null, data [varchar](256) NULL) 

GO 

-- test type 
CREATE TYPE [dbo].[usertype] AS TABLE(
    [id] [int] not null, 
    [Data] [varchar](256) NULL 
) 
GO 

-- test procedure 
create procedure p_test 
(
@tbl dbo.[usertype] READONLY 
) as 
BEGIN 
    UPDATE yourtable 
    SET data = t.data 
    FROM yourtable 
    JOIN 
    @tbl t 
    ON yourtable.id = t.id 
END 

go 

-- test data 

insert yourtable(id) 
values(1),(2),(3) 

go 

test de script:

declare @t [dbo].[usertype] 
insert @t values(1,'hello'),(2,'world') 

exec p_test @t 

select * from yourtable 

Résultat:

id data 
1 hello 
2 world 
3 NULL 
Questions connexes