updates par batch

Parfois lancer un update sur l'intégralité d'une grosse table pose des problèmes de concurrence. Il peut être utile d'updater par lot.

SET STATISTICS IO OFF
SET ROWCOUNT 100000
 
DECLARE @cnt int
SET @cnt = 1
 
WHILE @cnt > 0 BEGIN
        UPDATE ...
 
        SET @cnt = @@ROWCOUNT
END
chercher dans le code des objets

sp, fonctions… en utilisant syscomments

SELECT DISTINCT
o.xtype,
o.name
FROM
dbo.syscomments c
JOIN dbo.sysobjects o ON c.id = o.id
WHERE
text LIKE '%string_to_search%'
ORDER BY
o.xtype, o.name
chercher dans le code des objets, sur toutes les bases
SET STATISTICS IO OFF
SET NOCOUNT ON
 
EXEC sp_MSForEachdb
	@Command1 = 'USE ?; 
	DECLARE @clause varchar(40)
 
	SET @clause  = ''string_to_search''
 
	SELECT	''?'' as db, o.name, o.xtype --, *
	FROM	dbo.syscomments c
	JOIN	dbo.sysobjects o ON c.id = o.id
	WHERE	c.text LIKE ''%''+@clause+''%'' AND
		o.name NOT LIKE ''%''+@clause+''%''
	ORDER BY o.xtype, o.name'
compte les enregistrements d'une table
SELECT i.name, i.rowcnt
FROM sysindexes i
JOIN sysobjects o ON i.id = o.id
WHERE o.name = 'table_name'
AND rowcnt > 0
Utiliser les tables systèmes pour générer du code SQL
SELECT 	'TRUNCATE TABLE dbo.['+name+']'
FROM 	dbo.sysobjects
WHERE 	xtype = 'U' AND
	name NOT IN ('dtproperties')
ORDER BY name
Tester un entier positif

Plutôt que le ISNUMERIC() qui accepte les float, etc.

DECLARE @txt varchar(50)
SET @txt = '12349'
IF @txt LIKE REPLICATE('[0-9]', LEN(@txt))
	PRINT 'yes !'
Récupérer la dernière instruction exécutée
CREATE TABLE #tmp (
	EventType varchar(100),
	Parameters int,
	EventInfo varchar(4000)
)
 
INSERT INTO #tmp EXEC ('DBCC INPUTBUFFER(@@SPID)')
 
SELECT * FROM #tmp
COLUMNS_UPDATED()

COLUMNS_UPDATED() n'est pas la fonction la plus facile à utiliser. C'est un euphémisme. Voici du code emprunté à Vlad Vissoultchev sur microsoft.public.sqlserver.programming. Attention, ce n'est valable qu'avec SQL Server 2000. Dans SQL Server 2005, on ne peut plus se fier à ORDINAL_POSITION. Voir l'aide en ligne de SQL 2005 pour la bonne façon de faire.

	SELECT COLUMN_NAME, ORDINAL_POSITION
	FROM INFORMATION_SCHEMA.COLUMNS
	WHERE TABLE_NAME='temp'
	AND (SUBSTRING(COLUMNS_UPDATED(), (ORDINAL_POSITION-1) / 8 + 1, 1) & POWER(2, (ORDINAL_POSITION-1) % 8)) <> 0

Démonstration :

CREATE TABLE dbo.temp (id1 int, id2 int, id3 int, id4 int, id5 int, id6 int, id7 int, id8 int, id9 int)
GO
 
CREATE TRIGGER art$temp ON dbo.temp
AFTER UPDATE
AS BEGIN
	SELECT COLUMN_NAME, ORDINAL_POSITION
	FROM INFORMATION_SCHEMA.COLUMNS
	WHERE TABLE_NAME='temp'
	AND (SUBSTRING(COLUMNS_UPDATED(), (ORDINAL_POSITION-1) / 8 + 1, 1) & POWER(2, (ORDINAL_POSITION-1) % 8)) <> 0 
END
GO
 
INSERT INTO dbo.temp VALUES (1,2,3,4,5,6,7,8,9)
GO
 
UPDATE dbo.temp SET id9 = 2
GO
UPDATE dbo.temp SET id3 = 2
GO
 
DROP TABLE dbo.temp
GO
 
sql_server/snippets/astuces.txt · Dernière modification: 2006/08/03 09:37 (édition externe)