2016-02-29 130 views
0

我是一位初学者,带有TSQL脚本,我需要一个手使我的存储过程按预期工作。带参数和变量的TSQL存储过程

我想在我的sp中使用@date参数以logc @ 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

第一。如果你正在处理日期信息,你应该使用日期,而不是varchar。然后你有大量的语法错误,没有数据类型定义的变量,没有定义的变量被使用。 –

+0

什么变量没有在脚本中定义?感谢输入@SeanLange – Froxer

+1

@datum没有在那里定义。另外,什么是curdate()和curtime()。那些看起来像mysql函数。你真的应该让你的输入参数是一个日期而不是varchar(8)。当你传入'a8djf'会发生什么? –

回答

1

DECLARE报表需要包括数据类型:

你应该使用正确的数据类型...总是
Declare @pathRail varchar(31) = 'x:\xxxx\SYSTEMID\'; 
Declare @pathDate varchar(15) = convert(char, getdate(), 12); 
+0

好的,编辑我的脚本。 – Froxer

+0

修复语法错误并编辑了一些逻辑。我现在有一个工作格式化文件!接受为答案 – Froxer