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: