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

Откуда: Дубна
Сообщений: 295
Мне кажется, или тут можно было всё сделать проще?

Задача: Произвести загрузку файла в БД. НО! нельзя в коде указывать текст запроса. Загрузка должна быть реализована через вызов ХП с параметрами! Вот и пришлось так извратиться...

Программа на WinForms

USE [VMK_KSDB]
GO
/****** Object:  StoredProcedure [dbo].[p_AutoUpdaterUploadFile]    Script Date: 16.01.2014 11:33:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/****** Script for SelectTopNRows command from SSMS  ******/
ALTER PROCEDURE [dbo].[p_AutoUpdaterUploadFile]
	   @FileName nvarchar(100)
      ,@FileLastWriteTIme nvarchar(100)
      ,@Version nvarchar(100)
      ,@Size nvarchar(100)
      ,@Checksum nvarchar(100)
      ,@IsActive nvarchar(100)
      ,@IsDel nvarchar(100)
	  ,@path nvarchar(100)
AS
Declare @SQL varchar(max)
Declare @Id_file int

IF EXISTS (SELECT TOP(1) Id FROM t_Files WHERE Filename=@FileName)
	SELECT TOP(1) @Id_file = Id FROM t_Files WHERE Filename=@FileName
ELSE BEGIN
	insert into t_Files (Filename) VALUES (@FileName)
	SELECT TOP(1) @Id_file = Id FROM t_Files WHERE Filename=@FileName
END

set @SQL =
'INSERT INTO t_FileVersions 
(		[Id_file]
      ,[UploadDate]
      ,[FileLastWriteTIme]
      ,[Version]      
      ,[Size]
      ,[Checksum]
      ,[IsActive]
      ,[IsDel]
	  ,[Binary]
)  
SELECT
	    ' + cast (@Id_file as varchar) + ' as [Id_file]'
      +', GETDATE()' + ' as [UploadDate]'
      +', ''' + @FileLastWriteTIme  + ''' as [FileLastWriteTIme]'
      +', ''' + @Version + ''' as [Version]    '
      +', ' + @Size + ' as [Size]'
      +', ' + @Checksum, ' + as [Checksum]'
      +', ' + @IsActive + ' as [IsActive]'
      +', ' + @IsDel + + ' as [IsDel]'
      +', * FROM OPENROWSET(BULK ''' + @path + ''', SINGLE_BLOB)' + ' as [Binary]'

Execute (@sql)

--EXEC	[dbo].[p_AutoUpdaterUploadFile]
--		@FileName = N'asd',
--		@FileLastWriteTIme = N'14.01.2014',
--		@Version = N'1.0.0.2',
--		@Size = N'158',
--		@Checksum = NULL,
--		@IsActive = N'1',
--		@IsDel = N'0',
--		@path = N'D:\Арасч с арендатором.xls'


К сообщению приложен файл. Размер - 17Kb
16 янв 14, 12:31    [15424040]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Ку.
НО! нельзя в коде указывать текст запроса.

Что ?
16 янв 14, 12:34    [15424064]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение процедуры  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Glory,

Я нем могу в коде самой программы написать например:
OleDbCommand command = new OleDbCommand("INSERT INTO dbo.t_Files (Version, [Key], Date, Binary) SELECT '..."


Я могу только вызвать процедуру с параметрами.
16 янв 14, 12:45    [15424144]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Ку.
Я могу только вызвать процедуру с параметрами.

И что мешает вызвать процедуру и передать ей содержимое файла в качестве параметра ?
16 янв 14, 12:51    [15424207]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение процедуры  [new]
aleks2
Guest
ALTER PROCEDURE [dbo].[p_AutoUpdaterUploadFile]
	   @FileName nvarchar(100)
      ,@FileLastWriteTIme nvarchar(100)
      ,@Version nvarchar(100)
      ,@Size nvarchar(100)
      ,@Checksum nvarchar(100)
      ,@IsActive nvarchar(100)
      ,@IsDel nvarchar(100)
	  ,@path nvarchar(100)
AS

IF NOT EXISTS (SELECT * FROM t_Files WHERE Filename=@FileName)
	insert into t_Files (Filename) VALUES (@FileName);

declare @blob table([Binary] varchar(max));

insert @blob([Binary]) Execute ('select * FROM OPENROWSET(BULK ''' + @path + ''', SINGLE_BLOB)' + ' as [Binary]');


INSERT INTO t_FileVersions 
(      [Id_file]
      ,[UploadDate]
      ,[FileLastWriteTIme]
      ,[Version]      
      ,[Size]
      ,[Checksum]
      ,[IsActive]
      ,[IsDel]
      ,[Binary]
)  
SELECT
        (SELECT TOP(1) Id FROM t_Files WHERE Filename=@FileName)
      , GETDATE()
      , @FileLastWriteTIme
      , @Version
      , @Size
      , @Checksum
      , @IsActive
      , @IsDel
      , (select top(1) [Binary] from @blob)
16 янв 14, 13:06    [15424311]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение процедуры  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
aleks2,

Спасибо большое!
16 янв 14, 13:59    [15424706]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить