从SQL中读取.txt文件中的数据

时间:2016-06-17 18:28:31

标签: sql sql-server

我有一个查询,其中我查找了90k + ID的数据。当我通常有一个用于查询数据的ID列表时,我将使用SQL列表语法:

where id in (1,2,3...,n)

然而,90K ID在查询中有点压倒性。所以我认为从文本文件中读取这个ID列表可能会容易一些,将ID批量插入临时表,并在where子句中执行子选择。

create table #temp1

bulk insert #temp1 from 'C:\Users\BXS8145\Documents\Temp\file.txt'

select * from mainTable where id in (select id from #temp1)

我无法做到这一点,因为我没有相应的权限来使用批量插入。

还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用OPENROWSET代替bulkinsert

SELECT * into temptable
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                'Excel 8.0;Database=C:\Documents and Settings\....\example.xls;IMEX=1',
                'SELECT * FROM [Sheet1$]')

其他选项

SSIS package to import Excel file

您也可以通过右键单击数据库转到任务,然后导入日期并将excel设置为源文件,即可从SSMS生成这样的包。

您是否有权创建链接服务器?

如果您在Excel中使用它们,或者我甚至认为txt文件,您也可以创建链接服务器。您必须以管理员身份打开SSMS才能执行此操作!此外,该文件必须是一个可访问的路径,我相信你自己和你的sqlagnet。例如。本地路径或文件共享。打开SSMS后,创建Excel链接服务器,然后查询。

这是我用来生成链接服务器语句并添加它的一个工具:

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    IN ORDER TO QUERY EXCEL YOU MUST RUN SSMS AS ADMINISTRATOR!!!!!!!

    This doesn't seem to affect import jobs run under the SQL Agent, but the way SSMS handles
    permissions to folders it is not prviledged when accessing the ACE 12.0 OLEDB provider.
    I have tried all of the in-process and giving direct permissions, etc. and only running SSMS as
    Administrator seems to work
*/

    DECLARE @RC int
    DECLARE @server nvarchar(128)
    DECLARE @srvproduct nvarchar(128)
    DECLARE @provider nvarchar(128)
    DECLARE @datasrc nvarchar(4000)
    DECLARE @location nvarchar(4000)
    DECLARE @provstr nvarchar(4000)
    DECLARE @catalog nvarchar(128)
    -- Set parameter values
    SET @server = N'XLSERVER'
    SET @srvproduct = N'Excel'
    SET @provider = N'Microsoft.ACE.OLEDB.12.0'
    --SET @provider = N'Microsoft.ACE.OLEDB.15.0'
    SET @datasrc = N'FULLFILEPATH'
    --SET @provstr = N'Excel 12.0; HDR=Yes' ---wihtout imex
    SET @provstr = N'Excel 12.0;IMEX=1;HDR=YES;' ----Office 2007+
    --SET @provstr = N'Excel 8.0;IMEX=1;HDR=YES;' ----Office 97-2003 Uses Jet 4.0 instead of ACE 12.0

    IF EXISTS(SELECT * FROM sys.servers WHERE name = @server)
    BEGIN
        --Drop The Current Server
        EXEC master.dbo.sp_dropserver @server, @droplogins='droplogins'
    END

    EXEC @RC = [master].[dbo].[sp_addlinkedserver] @server, @srvproduct, @provider, 
    @datasrc, @location, @provstr, @catalog

以下是创建链接服务器后如何从数据中进行选择。注意文件无法打开!

SELECT *
FROM
    XLSERVER...Sheet1$

答案 1 :(得分:0)

一个丑陋的解决方法是将数据传递到Excel并为插入字符串

创建公式
create Table #Temp (id int)
Insert into #Temp values
(1),   << this would be a formula to format the string
(2),
...

然后

select A.* 
 from mainTable A
 Join #temp1 B on A.ID=B.ID