Per generare automaticamente le Stored Procedure per le mie tabelle, io recupero tutte le informazioni sulle tabelle dal database, aggiongendo poi a queste, una serie di informazioni specifiche non codificate su DB ma predisposte su delle classi serializzate in XML.
Le query che uso x le info sono le seguenti:
-- Query x controllare se un oggetto esiste o meno
-- da usare x generare uno script di CREATE o di ALTER
private const string SQL_ExistObject = @"
DECLARE @ExistInDb bit
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = @ObjectName
AND xtype = @ObjectType)
BEGIN
SET @ExistInDb = 1
END
ELSE
BEGIN
SET @ExistInDb = 0
END
SELECT @ExistInDb
";
private const string
-- Informazioni estese sui campi della tabella
-- Se guid, se identity se computed ecc.
SQL_GetColumnExtraInfo = @"
SELECT sys.all_objects.[object_id]
,sys.all_objects.[name] AS [TableName]
, sys.all_objects.[type] AS [Type]
, sys.all_columns.[name] AS [Name]
, sys.all_columns.[is_rowguidcol] AS [IsGuid]
, sys.all_columns.[is_identity] AS [IsIdentity]
, sys.all_columns.[is_computed] AS [IsComputed]
FROM sys.all_objects
INNER JOIN sys.all_columns
ON sys.all_objects.[object_id]
= sys.all_columns.[object_id]
WHERE [type] = 'U'
AND sys.all_objects.[name] = @TableName
";
-- Dati di base sulle colonne
private const string SQL_GetColumnInfo = @"
SELECT
[column_name] AS [Name]
, CASE WHEN [is_nullable] = 'YES' THEN 1 ELSE 0 END AS [Nullable]
, [Data_Type] AS [Type]
, isnull([character_maximum_length], 0) AS [Length]
, isnull([numeric_precision], 0) AS [Precision]
, isnull ([numeric_scale], 0) AS [Scale]
, column_default as [Default]
FROM
Information_schema.columns
WHERE [table_name] = @TableName
";
-- Dati sulla PK
private const string SQL_GetPkInfo = @"
SELECT CASE WHEN xtype = 'PK' THEN 1 ELSE 0 END AS [IsInPk], column_name AS [Name]
FROM
Information_schema.key_column_usage
INNER JOIN
sysobjects
ON Information_schema.key_column_usage.constraint_name =
sysobjects.[name]
WHERE xtype = 'PK'
AND table_name = @TableName
";
Spero che possano sufficierti
Saluti
Sabrina
Inviato da AndreaZ on 20/07/2008 10.48.18
Sto tentando di recuperare in un colpo solo determinate informazioni sulle colonne di una tabella.
I campi per me fondamentli sono: Nome, DataType, Max Length e soprattutto PrimaryKey.
Mi sono avvicinato molto con questa query ma i risultati che ottengo sono duplicati ed il campo booleano che identifica la PK è sbagliato:
SELECT sys.columns.name AS Nome, TYPE_NAME(sys.columns.user_type_id) AS DataType, sys.columns.max_length AS Dimensione,
sys.columns.column_id, sys.indexes.is_primary_key AS ChiavePrimaria
FROM sys.indexes INNER JOIN
sys.index_columns ON sys.indexes.object_id = sys.index_columns.object_id INNER JOIN
sys.columns ON sys.index_columns.object_id = sys.columns.object_id
WHERE (sys.indexes.object_id = OBJECT_ID('dbo.titoli'))
ORDER BY sys.columns.column_id
Grazie
Andrea