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

Откуда:
Сообщений: 9
Есть ряд запросов.
Как мне из статических запросов сделать динамические?
1. Запрос импорта данных из файла Excel в MSSQL. Я бы хотела сделать из запроса хранимую процедуру. Имя таблицы и имя импортируемого файла должны быть динамическими, еще лучше, если выпадет диалог, какое имя файла вводить.
Уже создана база данных db1.
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
USE db1;
GO
SELECT * INTO table1 FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=E:\file.xls', [Лист1$])
GO

2. Нужно сделать хранимую процедуру, где абсолютно все поля таблицы преобразовываются в тип varchar:
USE db1;
GO
ALTER TABLE table1 ALTER COLUMN field1 VARCHAR(25);
ALTER TABLE table1 ALTER COLUMN field2 VARCHAR(25);
ALTER TABLE table1 ALTER COLUMN field3 VARCHAR(25);
GO

3. Хранимая процедура, где все знаки ''(пустое значение) заменяются на число '0.0', а все знаки '-' заменяются на слово 'нет'.
USE db1;
GO
UPDATE table1 SET field1='0.0' WHERE field1='';
UPDATE table1 SET field1='нет' WHERE field1='-';
UPDATE table1 SET field2='0.0' WHERE field2='';
UPDATE table1 SET field2='нет' WHERE field2='-';
UPDATE table1 SET field3='0.0' WHERE field3='';
UPDATE table1 SET field3='нет' WHERE field3='-';
GO

4. Хранимая процедура, где у всех полей таблицы table1 я меняю типы данных
USE db1;
GO
ALTER TABLE field1 ALTER COLUMN field1 int;
ALTER TABLE field1 ALTER COLUMN field2 VARCHAR(25);
ALTER TABLE field1 ALTER COLUMN field3 float;
GO

Заранее благодарю.
Файл file.xls прикрепляю.

К сообщению приложен файл (file.xls - 14Kb) cкачать
25 янв 12, 18:46    [11970935]     Ответить | Цитировать Сообщить модератору
 Re: Каким образом сделать все статичные запросы динамичными  [new]
Oreolana
Member

Откуда:
Сообщений: 9
Немного изменила файл, чтобы было понятней.

К сообщению приложен файл (file.xls - 14Kb) cкачать
25 янв 12, 19:01    [11971026]     Ответить | Цитировать Сообщить модератору
 Re: Каким образом сделать все статичные запросы динамичными  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Oreolana 1.
Запрос импорта данных из файла Excel в MSSQL. Я бы хотела сделать из запроса хранимую процедуру. Имя таблицы и имя импортируемого файла должны быть динамическими, еще лучше, если выпадет диалог, какое имя файла вводить.
SQL-сервер умеет выполнять запросы. Диалогов он никаких рисовать не умеет.
Oreolana
2. Нужно сделать хранимую процедуру, где абсолютно все поля таблицы преобразовываются в тип varchar:
3. Хранимая процедура, где все знаки ''(пустое значение) заменяются на число '0.0', а все знаки '-' заменяются на слово 'нет'.
4. Хранимая процедура, где у всех полей таблицы table1 я меняю типы данных
Опуская очевидные вопросы "зачем?" и "вы хорошо подумали?", спрошу: а что не получается-то?
25 янв 12, 19:05    [11971039]     Ответить | Цитировать Сообщить модератору
 Re: Каким образом сделать все статичные запросы динамичными  [new]
Oreolana
Member

Откуда:
Сообщений: 9
Гавриленко Сергей Алексеевич, у меня выходят статичесике запросы без проблем.
Эту таблицу с запросами я взяла как пример. Вообще мне нужно сделать хранимые процедуры для таблиц с порядком 100 полей. я так думала, что лучше написать меньше строк динамического запроса, чем 100 строк статического.
Тот же запрос №2.
Если бы я писала на pаscal или delphi, я бы сделала цикл.
К сожалению, никак не могу понять, как мне организовать это на sql. И стоит ли вообще делать динамические запросы.
25 янв 12, 19:15    [11971097]     Ответить | Цитировать Сообщить модератору
 Re: Каким образом сделать все статичные запросы динамичными  [new]
aleks2
Guest
Oreolana
Если бы я писала на pаscal или delphi, я бы сделала цикл.
К сожалению, никак не могу понять, как мне организовать это на sql.


Вы не поверите, так же как и на Pascal.

declare @sql varchar(4000), @templ varchar(4000)
set @templ='ALTER TABLE table%t ALTER COLUMN field%f VARCHAR(25);'

declare @i int, @j int

set @i=10
set @j=100

while @i>0 begin

  while @j>0 begin
    set @sql=REPLACE('%t', LTRIM(STR(@i)),@templ) 
    set @sql=REPLACE('%f', LTRIM(STR(@j)),@sql)  
    exec(@sql)
    set @j=@j-1
  end;

  set @i=@i-1
end
26 янв 12, 06:59    [11973178]     Ответить | Цитировать Сообщить модератору
 Re: Каким образом сделать все статичные запросы динамичными  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Oreolana
Если бы я писала на pаscal или delphi, я бы сделала цикл.
Вы не поверите, но SELECT это цикл. Осталось только аггрегировать строку (через XML Path):
DECLARE	 @Query	VarChar(max)
	,@Table	SysName		= 'MyTable'
;WITH SomeTable AS (
	SELECT	*
	FROM	(VALUES (1),(2),(3),(4),(5)) N(Number)
)	SELECT	@Query = (	
	SELECT	'ALTER TABLE ', @Table, ' ALTER COLUMN field', N.Number AS [*], ' VARCHAR(25);
'	FROM	SomeTable	N
	ORDER BY N.Number
	FOR XML Path(''),Type).value('text()[1]','VarChar(max)')
PRINT @Query
--EXEC (@Query)

Только вот то что вы делаете не вижу смысла.
Можете сразу:
INSERT	dbo.Table1
SELECT	 CASE WHEN Field1 = ''		THEN 0		ELSE Field1 END AS Field1
	,CASE WHEN Field2 = 'нет'	THEN NULL	ELSE Field2 END AS Field2
	,CASE WHEN Field3 = ''		THEN 0		ELSE Field3 END AS Field3
	,...
FROM	OpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=E:\file.xls', [Лист1$])
Запрос можно также динамично состряпать.
26 янв 12, 10:38    [11973694]     Ответить | Цитировать Сообщить модератору
 Re: Каким образом сделать все статичные запросы динамичными  [new]
Oreolana
Member

Откуда:
Сообщений: 9
Спасибо Всем огромное!
Так намного стало понятней.
26 янв 12, 13:45    [11975407]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить