我是一位初学者,带有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。
第一。如果你正在处理日期信息,你应该使用日期,而不是varchar。然后你有大量的语法错误,没有数据类型定义的变量,没有定义的变量被使用。 –
什么变量没有在脚本中定义?感谢输入@SeanLange – Froxer
@datum没有在那里定义。另外,什么是curdate()和curtime()。那些看起来像mysql函数。你真的应该让你的输入参数是一个日期而不是varchar(8)。当你传入'a8djf'会发生什么? –