TSQL存储过程带参数&变量

时间:2016-02-29 18:45:42

标签: sql-server tsql stored-procedures

我是TSQL脚本的初学者,我需要帮助我的存储过程按预期工作。

我想在我的sp中使用@date参数来获取logg @ date - 以ccyymmdd格式。此外,是否有任何安全漏洞或优化我可以想到比Tablock更多? tablock会成为未来的问题吗?

清除问题: 当我进行批量插入时,我希望数据根据@datum进入数据库,目前它没有按预期工作。任何提示将不胜感激。批处理文件将按日计划运行,以将数据插入dbname @ datum。

当前SP代码:

USE [dbname]
GO
/****** Object:  StoredProcedure [dbo].[fillDbTablelogg]    Script Date: 2016-02-26 16:47:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

 =============================================
 Author:        <Author,,Name>
 Create date:   <Create Date,,>
 Description:   <Description,,>
 =============================================
ALTER PROC [dbo].[fillDbname]
@datum date(8)
AS
BEGIN

SET NOCOUNT ON;
Declare @bulkInsert NVARCHAR(MAX)



Declare @pathRail nvarchar(100)  = 'x:\xxxx\SYSTEMID\';
Declare @pathDate nvarchar(100) = convert(char, getdate(), 12); 
--Want to use my @Date parameter instead, sending in 8 digits so ccyymmdd
Declare @fromPath NVARCHAR(MAX) = '@pathRail' + '20' + '@pathDate' + '.tab';
--should print 'x:\xxxx\SYSTEMID\pathRailccyymmdd.tab'


Declare @ErrorPath nvarchar(100) = 'x:\xxxx\SYSTEMID\err';
--x:\xxxx\SYSTEMID\err2014-11-22.12:45:34.log
Declare @ErrorNow nvarchar(100) = curdate() + '.' + curtime() + '.log';
Declare @errorFilePath NVARCHAR (100) = @ErrorPath + @ErrorNow;

--Will change this formatfilename later to something more suiting, I have a working XML format file created with bcp.
Declare @formatFile nvarchar (100) = 'x:\xxxx\SYSTEMID\dbo.nameccyymmdd.xml';

set @bulkInsert =  '
BULK INSERT dbname.logg' + @datum + 'FROM' + @fromPath +'
WITH 
    (
   FIRSTROW = 1,
   ORDER (Id),
   CODEPAGE = Finnish_Swedish_CI_AS,
   FIELDTERMINATOR = \t,
   ROWTERMINATOR = 0x0a,
   TABLOCK,
   ERRORFILE = @errorFilePath,
   FORMATFILE = @formatFile, 
   --KEEPNULLS
   );'
   exec(@bulkInsert)
   end

修正:为所有变量添加了数据类型。确保首先创建所有使用的变量。将@datum变量编辑为数据类型日期而不是varchar。

1 个答案:

答案 0 :(得分:1)

您的DECLARE语句需要包含数据类型:

Declare @pathRail varchar(31) = 'x:\xxxx\SYSTEMID\';
Declare @pathDate varchar(15) = convert(char, getdate(), 12);