|
|
Subject: Creazione script CREATE TABLE
From: Andrea Benedetti
Date: 5/1/2007 3:35:29 PM
Salve MadLuke,
"MadLuke" <luca2510@hotmail.com> ha scritto nel messaggio
news:1177942245.741063.234860@c35g2000hsg.googlegroups.com...
>> Qualche giorno fa Andrea ha proposto la seguente
>> soluzione:http://groups.google.it/group/microsoft.public.it.sql/browse_thread/t...
>
> Davvero ottimo!
>
>
> Quelli di creazione indici e primary key invece?
>
> CREATE NONCLUSTERED INDEX IX_CV_CVSource ON dbo.CV... beccando sia i
> clustered che no (divisi per tabella)
>
>
> Spero di non essere troppo pretenzioso...
;-)
Puoi ricorrere ancora alle viste di sistema:
- INFORMATION_SCHEMA.TABLE_CONSTRAINTS
- INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE
Oppure utilizzare la soluzione (accede alle tabelle di sistema) che Aaron
Bertrand (MVP SQL) suggeriva tempo fa.
SET NOCOUNT ON
CREATE TABLE #indexes
(
table_name SYSNAME,
index_name SYSNAME,
column_name SYSNAME,
key_number TINYINT,
unique_word VARCHAR(8),
drop_commands VARCHAR(255)
)
GO
INSERT #indexes
SELECT
table_name = OBJECT_NAME(si.id),
index_name = si.name,
column_name = col.name, key_number = sik.keyno,
unique_word = CASE WHEN INDEXPROPERTY(si.id, si.name, 'isUnique') = 1 THEN
'UNIQUE ' ELSE '' END,
drop_commands = 'DROP INDEX '+OBJECT_NAME(si.id)+'.'+si.name
FROM syscolumns col
INNER JOIN sysindexkeys sik
ON sik.id = col.id AND sik.colid = col.colid
INNER JOIN sysindexes si
ON si.id = sik.id AND si.indid = sik.indid
WHERE
OBJECTPROPERTY(si.id, 'IsMsShipped') = 0
AND INDEXPROPERTY(si.id, si.name, 'isClustered') = 0
AND INDEXPROPERTY(si.id, si.name, 'isStatistics') = 0
ORDER BY table_name, keyno
CREATE TABLE #creates
(
table_name SYSNAME,
index_name SYSNAME,
create_commands VARCHAR(1024)
)
DECLARE
@ctn SYSNAME,
@cin SYSNAME,
@tn SYSNAME,
@in SYSNAME,
@cn SYSNAME,
@cmd VARCHAR(255),
@unique_word VARCHAR(8)
SELECT @ctn = '', @cin = ''
DECLARE ins CURSOR
FOR
SELECT table_name, index_name, column_name, unique_word
FROM #indexes ORDER BY table_name, key_number
OPEN ins
FETCH NEXT FROM ins INTO
@tn, @in, @cn, @unique_word
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF @tn = @ctn AND @in = @cin
BEGIN
UPDATE #creates SET create_commands = create_commands + ','+@cn
WHERE table_name = @tn AND index_name = @in
-- add column
END
ELSE
BEGIN
-- new index
INSERT #creates VALUES
(
@tn,
@in,
'CREATE '+@unique_word+'INDEX '+@in+' ON '+@tn+'('+@cn
)
SET @ctn = @tn
SET @cin = @in
END
FETCH NEXT FROM ins INTO
@tn, @in, @cn, @unique_word
END
SELECT create_commands = create_commands + ')'
FROM #creates
CLOSE ins
DEALLOCATE ins
DROP TABLE #creates
DROP TABLE #indexes
> Di nuovo, MadLuke.
Ciao!
--
Andrea Benedetti
Microsoft MVP - SQL Server
www.absistemi.it - www.ugiss.org
http://blogs.ugidotnet.org/ab
http://mvp.support.microsoft.com
http://italy.mvps.org
|