我是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。
答案 0 :(得分:1)
您的DECLARE
语句需要包含数据类型:
Declare @pathRail varchar(31) = 'x:\xxxx\SYSTEMID\';
Declare @pathDate varchar(15) = convert(char, getdate(), 12);