Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tự động tạo loại bảng do người dùng xác định phù hợp với bảng hiện có

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để bỏ khóa ngoại trong SQL Server?

  2. Trình tự thực thi của mệnh đề Group By, Have và Where trong SQL Server?

  3. SQL SERVER 2008 TRIGGER TRÊN TẠO BẢNG

  4. Thế tiến thoái lưỡng nan về đặt tên bảng:Tên số ít so với số nhiều

  5. Tại sao ISNUMERIC (',') là true?