Создать свойства Get Set из имени таблицы для представлений в классе

#tsql #fetch

#tsql #выборка

Вопрос:

Приведенный ниже код представляет собой быстрый скрипт на T-SQL, который создает свойства Get Set для использования в КЛАССЕ:

 DECLARE @COLUMN_NAME varchar(250)
DECLARE @DATA_TYPE varchar(250)
DECLARE c1 CURSOR FOR

select COLUMN_NAME, DATA_TYPE from information_schema.columns
where table_name = 'Members'
OPEN c1
FETCH NEXT FROM c1 INTO @COLUMN_NAME, @DATA_TYPE
WHILE @@FETCH_STATUS = 0
BEGIN

IF @DATA_TYPE = 'nvarchar'
BEGIN
    SET @DATA_TYPE = 'string'
END

IF @DATA_TYPE = 'ntext'
BEGIN
    SET @DATA_TYPE = 'string'
END

IF @DATA_TYPE = 'datetime'
BEGIN
    SET @DATA_TYPE = 'DateTime'
END


PRINT 'public '   @DATA_TYPE   ' '   @COLUMN_NAME   ' { get; set; }'

FETCH NEXT FROM c1 INTO @COLUMN_NAME, @DATA_TYPE

END
CLOSE c1
DEALLOCATE c1
GO
  

ЕСЛИ вы можете добавить к нему или очистить его, это было бы здорово!

ОБНОВИТЬ Приведенный ниже код работает, и я внес некоторые небольшие изменения.

 DECLARE @Script NVARCHAR(MAX) = ''

SELECT @Script = @Script   '
public '   CASE WHEN DATA_TYPE IN ('nvarchar','ntext') THEN 'string' 
                WHEN DATA_TYPE = 'datetime' THEN 'DateTime' 
                ELSE DATA_TYPE
            END 
                          ' ' 
                          upper(substring(COLUMN_NAME,1,1)) 
                          lower(substring(COLUMN_NAME,2,499))   
                          ' { get; set; }'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SubCategory'

PRINT @Script
  

Ответ №1:

Вы можете избавиться от курсора и значительно сократить его с помощью

 DECLARE @Script NVARCHAR(MAX) = ''

SELECT @Script = @Script   '
public '   CASE WHEN DATA_TYPE IN ('nvarchar','ntext') THEN 'string' 
                WHEN DATA_TYPE = 'datetime' THEN 'DateTime' 
                ELSE DATA_TYPE
            END 
                          ' '   COLUMN_NAME   ' { get; set; }'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Members'

PRINT @Script
  

Комментарии:

1. Неплохо. Я был слишком ленив, чтобы запускать SSMS для этого; p И 1, в частности, для исправления оболочки в таблицах info-schema — в противном случае, проблема в режиме с учетом регистра.

2. Мне это нравится! Хороший фрагмент чистого кодирования, за которым легко следить. Отличная работа!

Ответ №2:

Если это делает то, что вам нужно … прекратите возиться; p Если вы хотите получить обратную связь:

  • этот курсор не нужен; SELECT должно быть достаточно на основе набора; всякий раз, когда вы обнаруживаете, что пишете курсор, это вероятно неправильно
  • либо присоединиться к таблице сопоставления (между типами SQL и типами C #), либо использовать CASE .... для выбора встроенного
  • возможно, вы захотите быть параноиком в отношении зарезервированных слов, например public — в C # вам нужно было бы использовать @public для этого (или избегать этого)
  • возможно, вам захочется убрать пробелы; вы можете вызвать столбец db [something with spaces] , но это не будет работать в C#
  • вы могли бы проверить наличие MS_Description значения в расширенных метаданных и записать его в (одно из или, возможно, оба) ///<summary>...</summary> или [Description(@"...")]

Ответ №3:

 declare @TableName sysname = 'Members'
declare @result varchar(max) = ''

select @result = @result   '
public '   ColumnType   ' '   ColumnName   ' { get; set; }
'
from
(
    select replace(col.name, ' ', '_') ColumnName, 
        case typ.name 
            when 'bigint' then 'long'
            when 'binary' then 'byte[]'
            when 'bit' then 'bool'
            when 'char' then 'char'
            when 'date' then 'DateTime'
            when 'datetime' then 'DateTime'
            when 'datetime2' then 'DateTime'
            when 'datetimeoffset' then 'DateTimeOffset'
            when 'decimal' then 'decimal'
            when 'float' then 'float'
            when 'image' then 'byte[]'
            when 'int' then 'int'
            when 'money' then 'decimal'
            when 'nchar' then 'char'
            when 'ntext' then 'string'
            when 'numeric' then 'decimal'
            when 'nvarchar' then 'string'
            when 'real' then 'double'
            when 'smalldatetime' then 'DateTime'
            when 'smallint' then 'short'
            when 'smallmoney' then 'decimal'
            when 'text' then 'string'
            when 'time' then 'TimeSpan'
            when 'timestamp' then 'DateTime'
            when 'tinyint' then 'byte'
            when 'uniqueidentifier' then 'Guid'
            when 'varbinary' then 'byte[]'
            when 'varchar' then 'string'
        end ColumnType
    from sys.columns col
        join sys.types typ on
            col.system_type_id = typ.system_type_id
    where object_id = object_id(@TableName)
) t

print @result