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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (309)

我正在尝试为我的客户编写代码,以便将来可以在没有我帮助的情况下使用。他们将在其中一个桌面上安装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行,第2行和第4行需要手动编辑。通过将1个变量定义为日期(例如@dateinput ='9/12/2018'),我将代码简化为仅需要1个手动编辑,然后其他变量相应地定义自己(例如@DBName =' sep12',@ FilePrefix ='20180912'等。

我的问题是:

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

提问于
用户回答回答于

您可以通过使用一些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);
用户回答回答于

创建存储过程?

SET ANSI_NULLS ON
走
SET QUOTED_IDENTIFIER ON
走
-- =============================================
- 作者:      
- 创建日期: 
- 说明: 
-- =============================================
CREATE PROCEDURE [dbo]。[ImportData]
    @date varchar(15)
如
开始
    - 添加SET NOCOUNT ON以防止出现额外的结果集
    - 干扰SELECT语句。
    SET NOCOUNT ON;

    - 在此处插入程序声明
    DECLARE @query AS varchar(MAX)
    SET @query ='创建数据库aug29
                  使用aug29
                  BULK INSERT dbo.Table FROM''\\ Drive \ Documents \'''+ @date +''' -  xxx.txt''
                  WITH(FIRSTROW = 2,FIELDTERMINATOR =''\ t'',ROWTERMINATOR =''\ n'')'
   EXEC(@query)
结束

然后在SSMS上打开您的数据库>可编程>存储过程>右键单击新创建的存储过程(ImportData或您命名的任何一个)>执行存储过程。

然后,用户可以输入@date参数的值。

扫码关注云+社区

领取腾讯云代金券