Tôi cần điều tương tự theo thời gian. Đây là một kịch bản nhỏ mà tôi đã tổng hợp lại. Nó hơi khó khăn và tôi sẽ không tin tưởng nó với cuộc sống của mình, nhưng nó hoạt động hợp lý cho trường hợp của tôi. Nó không có khóa script, nhưng đối với kịch bản của tôi thì điều đó không cần thiết. Tuy nhiên, tôi đang sử dụng SQL 2012, vì vậy tôi không hoàn toàn chắc chắn rằng điều này sẽ hoạt động như trên SQL 2008. Tôi đã không kiểm tra nó cho một số kiểu 'kỳ lạ' hơn như geometry
, geography
và bạn bè, vì tôi không bao giờ cần sử dụng chúng.
declare
@tablename nvarchar(50)='Users',
@schemaname nvarchar(50)='dbo',
@sql nvarchar(max)=N'';
select @sql += N',' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'[' + c.COLUMN_NAME + N'] [' + DATA_TYPE + N']'
+ case when c.CHARACTER_MAXIMUM_LENGTH is not null then N'(' + case c.CHARACTER_MAXIMUM_LENGTH when -1 then 'max' else cast(c.CHARACTER_MAXIMUM_LENGTH as nvarchar(10)) end + N')' else N'' end
+ case when c.DATA_TYPE = N'numeric' then N'('+CAST(NUMERIC_PRECISION as nvarchar(10))+N', '+CAST(NUMERIC_SCALE as nvarchar(10))+N')' else N'' end
+ case when c.is_nullable <> N'NO' then N' NULL' else N' NOT NULL'end
from INFORMATION_SCHEMA.COLUMNS c
where TABLE_NAME = @tablename AND TABLE_SCHEMA = @schemaname
order by ORDINAL_POSITION;
set @sql = stuff(@sql, 1, 1, N'CREATE TYPE [' + @schemaname + N'].[tab_' + @tablename + N'] AS TABLE(')
+ nchar(13) + nchar(10) + ')' + nchar(13) + nchar(10) + 'GO';
set @sql += nchar(13) + nchar(10) + '--GRANT EXEC ON TYPE::[' + @schemaname + N'].[tab_' + @tablename + N'] TO [User];'
+ nchar(13) + nchar(10) + '--GO';
print @sql
-- If you're happy with the sql, you can pass it to sp_executesql to create your type
-- exec sp_executesql @sql;