Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 А можно-ли без курсора  [new]
hey
Guest
Есть функция:

ALTER FUNCTION [dbo].[GetColumnsString] 
(
	@tableName VARCHAR(100)
)
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE cur CURSOR FOR 
SELECT c.column_name, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH
FROM   INFORMATION_SCHEMA.[COLUMNS] c
WHERE  c.TABLE_NAME = @tableName

OPEN cur

DECLARE @result AS VARCHAR(8000)
SET @result = ''

DECLARE @column AS VARCHAR(100)
DECLARE @dataType AS VARCHAR(100)
DECLARE @characterMaxLength AS int


FETCH NEXT FROM cur INTO @column, @dataType, @characterMaxLength
WHILE @@FETCH_STATUS = 0
BEGIN

IF COLUMNPROPERTY(OBJECT_ID(@tableName),@column,'IsIdentity') <> 1
BEGIN
	SET @result = @result + @column + ' ' + @dataType 
	IF @characterMaxLength IS NOT NULL
	BEGIN
		SET @result = @result + '(' +  CAST(@characterMaxLength AS VARCHAR(10)) + ')'
	END
	SET @result = @result + ', '
END

FETCH NEXT FROM cur INTO @column, @dataType, @characterMaxLength
END


CLOSE cur
DEALLOCATE cur

RETURN SUBSTRING(@result, 0, LEN(@result))
END

результатом ее работы является строка с колонками данной таблицы за исключением айдентити столбцов (эта строка потом используется в другой процедуре для динамического импорта данных), типа:

'Calendar_Date smalldatetime, Holiday_Type char(1), User_Id nvarchar(20)'

Можно-ли заменить курсор селектом ?
24 сен 09, 07:32    [7700930]     Ответить | Цитировать Сообщить модератору
 Re: А можно-ли без курсора  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Можно.

https://www.sql.ru/faq/faq_topic.aspx?fid=130
24 сен 09, 07:38    [7700938]     Ответить | Цитировать Сообщить модератору
 Re: А можно-ли без курсора  [new]
hey
Guest
DECLARE @result AS VARCHAR(8000)
SET @result = ''
SELECT @result = @result + 
case when COLUMNPROPERTY(OBJECT_ID('MyTable'),c.column_name,'IsIdentity') <> 1 then 
	c.column_name + ' ' + c.DATA_TYPE +
       '(' + CAST(ISNULL(c.CHARACTER_MAXIMUM_LENGTH, '0') AS VARCHAR(100)) + 
       '), '
       end
       	
FROM   INFORMATION_SCHEMA.[COLUMNS] c
WHERE  c.TABLE_NAME = 'MyTable'


SET @result = REPLACE(@result, '(0)', '')
select SUBSTRING(@result, 0, LEN(@result))

хм, что-то на таблице с айдентити это нулл выдает
На обычной таблице все нормально...
24 сен 09, 08:04    [7700969]     Ответить | Цитировать Сообщить модератору
 Re: А можно-ли без курсора  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
case when COLUMNPROPERTY(OBJECT_ID('MyTable'),c.column_name,'IsIdentity') <> 1 then 
	c.column_name + ' ' + c.DATA_TYPE +
       '(' + CAST(ISNULL(c.CHARACTER_MAXIMUM_LENGTH, '0') AS VARCHAR(100)) + 
       '), '
       else ''
       end
24 сен 09, 08:08    [7700972]     Ответить | Цитировать Сообщить модератору
 Re: А можно-ли без курсора  [new]
hey
Guest
cool, thanks...
24 сен 09, 08:11    [7700973]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить