SQL Server запрашивает у пользователя ввод и передает переменную - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь написать код для моего клиента, который он сможет использовать в будущем без моей помощи. Они установят SQLServer Express на один из своих рабочих столов (как я использовал), чтобы назначенное лицо могло ежедневно выполнять предварительно написанные запросы к локально хранимым данным для получения конкретной информации, которая им необходима. Я не хочу разбираться в том, почему мы используем SQL Server Express и таким образом управляем нашими данными, но верю, что мы рассмотрели альтернативы, и это наиболее выполнимый вариант.

Я хотел бы сделать выполнение запроса на импорт максимально простым для них, так как они не знакомы с SQL или кодированием в целом. На высоком уровне у меня есть около 15 файлов с разделителями табуляции, автоматически загружаемых в папку на моем локальном диске каждый день с непротиворечивым именем файла, за исключением предварительного исправления, которое является датой загрузки файла. Например, 20180912-xxx, 20180912-гггг и т. Д. Для всех файлов, загруженных 12 сентября.

Я запускаю массовый импорт, который создает базу данных на 12 сентября («sep12»), а затем загружает таблицы в базу данных; затем я использую переменную @date в операторах импорта для определения местоположения файла. Например:

CREATE DATABASE aug29
USE aug29
DECLARE @date VARCHAR(15)
SET @date = '20180829'

@import = 'BULK INSERT dbo.Table FROM ''\\Drive\Documents\' + @Date + '-xxx.txt''
WITH (FIRSTROW = 2, FIELDTERMINATOR = ''\t'', ROWTERMINATOR = ''\n'')'
EXEC(@import)

Как видите, для 1-й, 2-й и 4-й строк необходимо ручное редактирование. Я упростил код, чтобы потребовать только 1 ручное редактирование, определив 1 переменную в качестве даты (например, @dateinput = '9/12/2018'), а затем другие переменные определяют себя соответствующим образом (например, @DBName = ' sep12 ', @FilePrefix =' 20180912 'и т. д.).

Мой вопрос такой:

Могу ли я предложить пользователю ввести эту дату перед запуском кода? Что-то вроде Нажмите Выполнить> появится сообщение с подсказкой > Пользователь вводит дату> нажмите ОК> код запускается с введенным значением, сохраненным как переменная

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Создать хранимую процедуру?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      
-- Create date: 
-- Description: 
-- =============================================
CREATE PROCEDURE [dbo].[ImportData]
    @date   varchar(15)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    DECLARE @query AS varchar(MAX)
    SET @query = 'CREATE DATABASE aug29
                  USE aug29
                  BULK INSERT dbo.Table FROM ''\\Drive\Documents\''' + @date + '''-xxx.txt''
                  WITH (FIRSTROW = 2, FIELDTERMINATOR = ''\t'', ROWTERMINATOR = ''\n'')'
   EXEC(@query)
END

Затем в SSMS откройте свою базу данных> Программируемость> Хранимые процедуры> Щелкните правой кнопкой мыши по вновь созданной Хранимой процедуре (ImportData или как вы ее называете)> Выполнить хранимую процедуру.

Пользователи могут затем ввести значение для параметра @date.

enter image description here

0 голосов
/ 30 августа 2018

Вы можете сделать свой сценарий полностью независимым от пользовательского ввода, используя некоторые встроенные функции SQL Server, как я делаю ниже:

--Variable to use for dynamic sql
DECLARE @sqlStatement varchar(MAX) = '';
--Returns the  month as its full name like June, or July
DECLARE @fullMonthValue varchar(100) = DATENAME(month, DATEADD(month, MONTH(GETDATE()) -1, CAST('2008-01-01' AS datetime)));
--Get the database name how you gave in your example, for example today is August 30th, this will result in aug30
DECLARE @databaseName varchar(100) = LOWER(SUBSTRING(@fullMonthName, 1, 3)) + CAST(DAY(GETDATE()) AS varchar(3));
--Now get the current date as string for use in your bulk insert
DECLARE @today = CAST(GETDATE() AS Date);
--cast the current date to varchar (string) and remove the hyphens
DECLARE @stringDate = REPLACE(CAST(@today AS varchar(100)), '-', ''); --Need to remove the hyphens
--Set the sql statement for creating the database
SET @sqlStatment = 'Create DataBase ' + @databaseName;

--Execute the sqlStatement to create the database
EXEC(@sqlStatement);

--At this point @stringDate is already the format you want for your example variable of @date


  --Just put your USE statement into your dynamic sql string
    @import = 'USE ' + @databaseName + 'BULK INSERT dbo.Table FROM ''\\Drive\Documents\'' + @stringDate + '-xxx.txt''
    WITH (FIRSTROW = 2, FIELDTERMINATOR = ''\t'', ROWTERMINATOR = ''\n'')';

    EXEC(@import);
...