我正在尝试为我的客户编写代码,以便他们将来在没有我帮助的情况下使用。他们将在自己的一个台式机上安装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'等。
我可以在运行代码之前提示用户输入此日期吗?就像是 单击执行>弹出消息提示>用户输入日期>单击确定>代码以输入的值存储为变量运行
答案 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参数的值。
答案 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);