c# - SQL: mettre à jour une ligne et renvoyer une valeur de colonne avec 1 requête





sql-server tsql ado.net (6)


Je n'ai pas pu mettre à jour et retourner une ligne dans une instruction select . C'est-à-dire que vous ne pouvez pas utiliser la valeur sélectionnée parmi les autres réponses.

Dans mon cas, je voulais utiliser la valeur sélectionnée dans une requête. La solution que j'ai trouvée était:

declare @NextId int
set @NextId = (select Setting from Settings where key = 'NextId')

select @NextId + ROW_NUMBER() over (order by SomeColumnOfYourTable) from YourTable

update Settings set Setting = Setting + @@ROWCOUNT 
where key = 'NextId'

J'ai besoin de mettre à jour une ligne dans une table, et d'en obtenir une valeur de colonne. Je peux le faire avec

UPDATE Items SET Clicks = Clicks + 1 WHERE Id = @Id;
SELECT Name FROM Items WHERE Id = @Id

Cela génère 2 plans / accès à la table. Est-ce que possibile dans T-SQL pour modifier l'instruction UPDATE afin de mettre à jour et retourner la colonne Nom avec 1 plan / accès seulement?

J'utilise les méthodes C #, ADO.NET ExecuteScalar() ou ExecuteReader() .




Utilisez une procédure stockée pour cela.




N'accède à la table qu'une seule fois:

UPDATE Items SET Clicks = Clicks + 1 , @Name = Name WHERE Id = @Id;
select @name;



Vous voulez la clause OUTPUT

UPDATE Items SET Clicks = Clicks + 1
OUTPUT INSERTED.Name
WHERE Id = @Id



Créer une procédure stockée qui prend le @id en tant que paramètre et fait ces deux choses. Vous utilisez ensuite un DbDataAdapter pour appeler la procédure stockée.




Le premier lien vers sp_generate_inserts est plutôt cool, voici une version très simple:

DECLARE @Fields VARCHAR(max); SET @Fields = '[QueueName], [iSort]' -- your fields, keep []
DECLARE @Table  VARCHAR(max); SET @Table  = 'Queues'               -- your table

DECLARE @SQL    VARCHAR(max)
SET @SQL = 'DECLARE @S VARCHAR(MAX)
SELECT @S = ISNULL(@S + '' UNION '', ''INSERT INTO ' + @Table + '(' + @Fields + ')'') + CHAR(13) + CHAR(10) + 
 ''SELECT '' + ' + REPLACE(REPLACE(REPLACE(@Fields, ',', ' + '', '' + '), '[', ''''''''' + CAST('),']',' AS VARCHAR(max)) + ''''''''') +' FROM ' + @Table + '
PRINT @S'

EXEC (@SQL)

Sur mon système, j'obtiens ce résultat:

INSERT INTO Queues([QueueName], [iSort])
SELECT 'WD: Auto Capture', '10' UNION 
SELECT 'Car/Lar', '11' UNION 
SELECT 'Scan Line', '21' UNION 
SELECT 'OCR', '22' UNION 
SELECT 'Dynamic Template', '23' UNION 
SELECT 'Fix MICR', '41' UNION 
SELECT 'Fix MICR (Supervisor)', '42' UNION 
SELECT 'Foreign MICR', '43' UNION 
...




c# sql-server tsql ado.net