我正在尝试使用CREATE TABLE
表生成基于 SQL-SERVER 数据库中给定表的语句INFORMATION_SCHEMA
,但是当我尝试连接DEFAULT
字段声明的部分时,我的代码现在仅显示带有 的字段DEFAULT
,尽管它是像这样连接的到目前为止,字段声明的其他部分。
考虑这个表:
CREATE TABLE FOO (
ID int PRIMARY KEY NOT NULL,
BAR NVARCHAR(50) NULL,
CREATED_DATE DATETIME DEFAULT (GETDATE())
);
下面的代码生成语句,但不考虑默认值,并且还假设您只有一个主键并且没有外键。如果您添加注释掉的行,它会突然只包含一个具有默认值的字段,我无法弄清楚为什么会发生这种情况。
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;
这是注释掉该行的输出(因此任何DEFAULT
s 都被省略):
CREATE TABLE FOO (
[ID] int NOT NULL PRIMARY KEY,
[BAR] nvarchar(50) NULL,
[CREATED_DATE] datetime NULL
);
然后使用以下行:
CREATE TABLE FOO (
[CREATED_DATE] datetime NULL DEFAULT (GETDATE())
);
为什么我的代码会生成如此不同的响应?