Действительно ли возможно выполнить текстовый файл от SQL-запроса?

import java.util.*;
StringTokenizer st;
int ans;

public class check { 
   String str="7 + 5";
   StringTokenizer st=new StringTokenizer(str);

   int v1=Integer.parseInt(st.nextToken());
   String op=st.nextToken();
   int v2=Integer.parseInt(st.nextToken());

   if(op.equals("+")) { ans= v1 + v2; }
   if(op.equals("-")) { ans= v1 - v2; }
   //.........
}
37
задан Mitch Wheat 28 October 2008 в 02:19
поделиться

5 ответов

используйте xp_cmdshell и sqlcmd

EXEC xp_cmdshell  'sqlcmd -S ' + @DBServerName + ' -d  ' + @DBName + ' -i ' + @FilePathName
46
ответ дан Gulzar Nazim 10 October 2019 в 08:40
поделиться

Смотрите на OSQL. Эта утилита позволяет Вам выполнить SQL от командной строки. Легко быть установленным в системе, я думаю, что это идет со свободной SQL Server Express.

Используя osql Утилиту

qick поиск "OSQL" на переполнении стека показывает, что много материала доступно.

главным обработать правильно является пользователь и параметры учетной записи пароля, которые передаются в на командной строке. Я видел пакетные файлы, которые используют полномочия доступа к файлу NT управлять файлом с паролем и затем использующий содержание этого файла для запущения сценария. Вы могли также записать быстрый C# или программу VB для выполнения его с помощью класса Процесса.

3
ответ дан John Dyer 10 October 2019 в 08:40
поделиться

Я не был бы рекомендуемое выполнение этого, но если Вы действительно имеете к тогда расширенной хранимой процедуре xp_cmdshell , то, что Вы хотите. Необходимо будет сначала считать содержание файла в переменную и затем использовать что-то вроде этого:

DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd

Примечание: xp_cmdshell выполняет команды в фоновом режиме из-за этого, он не должен использоваться для запущения программ, которые требуют ввода данных пользователем.

5
ответ дан Mitch Wheat 10 October 2019 в 08:40
поделиться

Для аутентификации Windows, если Вы работаете как другой пользователь: Откройте Command Prompt как своего пользователя Windows (Щелчок правой кнопкой по нему, Откройте File Location, Shift + Щелчок правой кнопкой, Выполнение как другой пользователь)

 sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql"

Или если Вы используете пользователя SQL Server:

sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql" -U UserName -P Password

Замена localhost\SQLEXPRESS с Вами имя сервера, если не локальный сервер.

2
ответ дан 27 November 2019 в 04:24
поделиться

Для кого-либо спотыкающегося на этот вопрос как я сделал и мог бы найти это полезным, мне понравилось ответ Брюса Томпсона (который выполнил SQL из файлов в цикле), но я предпочел подход Пеша Хелфера к выполнению файла (поскольку это избегало использования xp_cmdshell).

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

DECLARE @Dir NVARCHAR(512) = 'd:\SQLScriptsDirectory'

DECLARE @FileList TABLE (
  subdirectory NVARCHAR(512),
  depth int,
  [file] bit
)

INSERT @FileList
EXEC Master.dbo.xp_DirTree @Dir,1,1

WHILE (SELECT COUNT(*) FROM @FileList) > 0  
BEGIN  
   DECLARE @FileName NVARCHAR(MAX) = (SELECT TOP(1) subdirectory FROM @FileList) 
   DECLARE @FullPath NVARCHAR(MAX) = @Dir + '\' + @FileName

   DECLARE @SQL NVARCHAR(MAX)
   DECLARE @SQL_TO_EXEC NVARCHAR(MAX)
   SELECT @SQL_TO_EXEC = 'select @SQL = BulkColumn
   FROM OPENROWSET
       (   BULK ''' + @FullPath + '''
       ,   SINGLE_BLOB ) AS MYTABLE'

   DECLARE @parmsdeclare NVARCHAR(4000) = '@SQL varchar(max) OUTPUT'  

   EXEC sp_executesql @stmt = @SQL_TO_EXEC
                 , @params = @parmsdeclare
                 , @SQL = @SQL OUTPUT  

   EXEC (@sql)
   DELETE FROM @FileList WHERE subdirectory = @FileName  

   PRINT 'EXECUTED: ' + @FileName     
END
1
ответ дан 27 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: