SQL Server提示用户输入并传递给变量

时间:2018-08-30 20:13:40

标签: sql sql-server tsql sql-server-2012

我正在尝试为我的客户编写代码,以便他们将来在没有我帮助的情况下使用。他们将在自己的一个台式机上安装SQLServer Express(就像我一直在使用的那样),以便指定人员每天可以对本地存储的数据运行预先查询的特定信息。我不想弄明白为什么我们使用SQL Server Express并以这种方式管理数据,但是相信我们已经研究了替代方法,这是最可行的选择。

我想让他们尽可能简单地执行导入查询,因为他们通常不熟悉SQL或编码。在较高级别上,我每天大约有15个制表符分隔的文件自动加载到本地驱动器上的文件夹中,文件名一致,前缀除外,即文件加载的日期。例如,9月12日加载的所有文件的20180912-xxx,20180912-yyy等。

我运行一个批量导入,该导入将在9月12日(“ sep12”)创建一个数据库,然后将这些表加载到数据库中;然后在import语句中使用@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个变量作为日期(例如@dateinput ='9/12/2018'),然后将其他变量相应地定义了自己(例如@DBName ='),从而简化了代码,仅需进行1次手动编辑。 sep12',@ FilePrefix ='20180912'等。

我的问题是这个

我可以在运行代码之前提示用户输入此日期吗?就像是 单击执行>弹出消息提示>用户输入日期>单击确定>代码以输入的值存储为变量运行

2 个答案:

答案 0 :(得分:1)

创建存储过程吗?

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

答案 1 :(得分:0)

您可以使用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);