Estou tentando gerar uma CREATE TABLE
instrução baseada em uma determinada tabela no meu banco de dados SQL-SERVER usando as INFORMATION_SCHEMA
tabelas, mas quando tento concatenar a DEFAULT
parte de uma declaração de campo, meu código só agora exibe o campo com um DEFAULT
, apesar de estar concatenado como as outras partes da declaração de campo até agora.
Considere esta tabela:
CREATE TABLE FOO (
ID int PRIMARY KEY NOT NULL,
BAR NVARCHAR(50) NULL,
CREATED_DATE DATETIME DEFAULT (GETDATE())
);
O código abaixo gera a instrução, mas não leva em consideração os padrões e também assume que você possui apenas uma chave primária e nenhuma chave estrangeira. Se você adicionar a linha comentada, de repente ela incluirá apenas o campo que tem um padrão, e não consigo entender por que isso está acontecendo.
DECLARE @TableName NVARCHAR(128) = 'FOO';
DECLARE @sql NVARCHAR(MAX) = 'CREATE TABLE ' + @TableName + ' (' + CHAR(13);
DECLARE @primaryKey NVARCHAR(128) = '';
-- Find primary key
SELECT @primaryKey = COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND CONSTRAINT_NAME LIKE 'PK%';
-- build the string
SELECT @sql = @sql + ' [' + COLUMN_NAME + '] ' +
DATA_TYPE +
CASE
WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
WHEN DATA_TYPE IN ('decimal', 'numeric') THEN '(' + CAST(NUMERIC_PRECISION AS VARCHAR) + ', ' + CAST(NUMERIC_SCALE AS VARCHAR) + ')'
ELSE ''
END +
CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE ' NULL' END +
CASE WHEN COLUMN_NAME = @primaryKey THEN ' PRIMARY KEY' ELSE '' END +
-- Uncomment below for weird behavior:
--CASE WHEN COLUMN_DEFAULT IS NOT NULL THEN ' DEFAULT ' + UPPER(COLUMN_DEFAULT) ELSE '' END +
',' + CHAR(13)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
ORDER BY ORDINAL_POSITION;
-- clean up ending
SET @sql = LEFT(@sql, LEN(@sql) - 2) + CHAR(13) + ');';
PRINT @sql;
Aqui está a saída com a linha comentada (portanto, quaisquer DEFAULT
s são deixados de fora):
CREATE TABLE FOO (
[ID] int NOT NULL PRIMARY KEY,
[BAR] nvarchar(50) NULL,
[CREATED_DATE] datetime NULL
);
E então com a linha:
CREATE TABLE FOO (
[CREATED_DATE] datetime NULL DEFAULT (GETDATE())
);
Por que meu código está gerando respostas tão diferentes?