#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