USE [ecom] GO /****** Object: StoredProcedure [dbo].[Load_ASCII_File] Script Date: 12/20/2016 17:32:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: James Newton -- Create date: 2016/12/16 -- Description: Load ASCII file with index -- Version 1: Works but requires unsafe permissions for the user -- ============================================= -- Note user will need execute permissions for this stored procedure. ALTER PROCEDURE [dbo].[Load_ASCII_File] @FileName AS Varchar(100) WITH EXECUTE AS 'textimportuser' -- the user executing this procedure must have impersonate rights from textimportuser AS BEGIN --DROP TABLE IF EXISTS [dbo].[Text] -- only on SQL Server 2016 and up. IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Text' AND TABLE_SCHEMA = 'dbo') DROP TABLE [dbo].[Text]; -- User will need delete permissions for that table, but once deleted, those permissions are lost, so instead... -- User will need alter permissions for the dbo schema. CREATE TABLE [dbo].[Text] ( text nvarchar(255) NULL ) ON [PRIMARY]; -- User will need alter permissions for the dbo schema. --BULK INSERT [dbo].[Text] FROM 'G:\temp\sqlimport\'+@FileName WITH (FIELDTERMINATOR='\0',ROWTERMINATOR='\n'); -- Nope, we have to do it dynamically in order to add the path here... How much does that suck? -- http://stackoverflow.com/questions/4050790/bulk-insert-using-stored-procedure DECLARE @Bulk varchar(MAX); SET @Bulk = 'BULK INSERT [dbo].[Text] FROM ''D:\temp\sqlimport\'+ @FileName + ''' WITH (FIELDTERMINATOR=''\0'',ROWTERMINATOR=''\n''); '; -- Note that the user SQLServer2005MSSQLUser#databasename must have full permissions for a folder -- from which it will import or restore data. Which is why we really want to limit this to that folder. EXEC(@Bulk); -- The login of the user will need bulkadmin permission to do the bulk insert. Not the user... the login... server wide. -- http://stackoverflow.com/questions/14604416/how-to-enable-bulk-permission-in-sql-server -- and even with all those permissions, it probably still won't let this shit run. -- Now add an index ALTER TABLE [dbo].[Text] ADD id int NOT NULL IDENTITY (1, 1); END /* or INSERT INTO with OPENROWSET and BULK: INSERT INTO dbo.text SELECT * FROM OPENROWSET ( DATABASE FIELDTERMINATOR='\0', ROWTERMINATOR='\n' ) AS t1; */
See also: