我正在尝试为我的客户编写代码,他们将来可以在没有我帮助的情况下使用这些代码。我不想深入讨论为什么我们使用SQL Server Express并以这种方式管理我们的数据,但请相信,我们已经研究了替代方案,这是最可行的选择。
我想让他们尽可能简单地执行导入查询,因为他们通常不熟悉SQL或编码。在较高的级别上,我每天将大约15个制表符分隔的文件自动加载到我的本地驱动器上的文件夹中,除了前缀之外,文件名都是一致的,前缀是文件加载的日期。例如,对于9月12日加载的所有文件,20180912-xxx、20180912-yyy等。
例如:
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行进行手动编辑。我已经简化了代码,只需要一次手动编辑,通过定义一个变量作为日期(例如。@dateinput = '9/12/2018'),然后其他变量相应地定义自己(例如@DBName = 'sep12',@FilePrefix = '20180912‘等)。
我的问题是:
我可以在运行代码之前提示用户输入此日期吗?类似单击执行>弹出消息提示>用户输入日期>单击确定>代码运行时将输入值存储为变量
发布于 2018-08-31 04:28:21
通过使用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);
https://stackoverflow.com/questions/52104723
复制相似问题