2
请帮我重写下面的CP,以便从文件中读取除去数字以外的任何其他字符: 它所做的是读取文件,例如block.txt和addes每行进入桌子。删除除数字以外的所有字符
USE [db_Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Cp_ImportBlackList]
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION Acbc
DECLARE @command nvarchar(max)
DECLARE @delcommand varchar(200)
DECLARE @txtfile nvarchar(200)
DECLARE @line nvarchar(2)
DECLARE @andreas nvarchar(200)
set @line='\n'
DECLARE @isExists INT
DECLARE @tempcol int
DECLARE MyCursor cursor fast_forward for
Select Users_ID from Prj_Users
open MyCursor
fetch next from MyCursor
into @tempcol
while @@fetch_status = 0
begin
set @txtfile = 'c:\BlackList\ ' + LTRIM(RTRIM(str(@tempcol))) + '.txt'
exec master.dbo.xp_fileexist @txtfile,
@isExists OUTPUT
if (@isExists =1)
begin
BEGIN TRY
BEGIN TRANSACTION ad
set @command=' BULK INSERT Prj_TempBlackList FROM ''' + @txtfile + ''''
set @command += ' WITH(ROWTERMINATOR = '''+ @line +''')'
print @command
EXECUTE(@command)
delete Prj_TempBlackList where Tell in(select [BLList_TEll] from prj_BlackList where [BLList_UserID] = @tempcol)
insert into prj_BlackList select DISTINCT Tell,@tempcol from Prj_TempBlackList where Tell not in(select [BLList_TEll] from prj_BlackList where [BLList_UserID] = @tempcol)
delete from Prj_TempBlackList
set @delcommand ='del ' + @txtfile
exec xp_cmdshell @delcommand
print 'end'
COMMIT TRANSACTION ad
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION ad
SELECT ERROR_Message() AS ErrorNumber;
END CATCH
end
else
print 'no'
fetch next from MyCursor
into @tempcol
end
close MyCursor
deallocate MyCursor
set @txtfile = 'c:\BlackList\block.txt'
exec master.dbo.xp_fileexist @txtfile,
@isExists OUTPUT
if (@isExists =1)
begin
BEGIN TRY
BEGIN TRANSACTION ada
set @command=' BULK INSERT Prj_TempBlackList FROM ''' + @txtfile + ''''
set @command += ' WITH(ROWTERMINATOR = '''[email protected]+''')'
EXECUTE(@command)
delete Prj_TempBlackList where Tell in(
select [BLList_TEll] from prj_BlackList where [BLList_UserID] is null)
insert into prj_BlackList SELECT DISTINCT Tell,null from
Prj_TempBlackList where Tell not in(
select [BLList_TEll] from prj_BlackList where [BLList_UserID] is null)
delete from Prj_TempBlackList
set @delcommand ='del ' + @txtfile
exec xp_cmdshell @delcommand
print 'yes'
COMMIT TRANSACTION ada
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION ada
SELECT ERROR_Message() AS ErrorNumber;
END CATCH
end
COMMIT TRANSACTION Acbc
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION Acbc
END CATCH
END
如果数据是在文件,为什么你为此使用SQL Server?有很多更好的工具来处理文件。 –
是否有必要在存储过程中完成整个ETL过程?这不是一种有效的方式。如果你使用类似SSIS的东西,加载你的文件,然后进行脚本组件转换,利用.NET的正则表达式函数([与此类似]),你会好得多(http://www.codeproject.com/Tips/531971/SSIS-Transform-data-using-Regex)),然后加载到目标表中。 – GarethD
@iman,如果我的答案解决了您的问题,请点击表决柜台下方的接受检查来接受它。 [请阅读:人 - 答案](http://stackoverflow.com/help/someone-answers)。谢谢! – Shnugo