Sql server 如何对另一个表中的每条记录重复查询?SQL Server 2012
我有一个Sql server 如何对另一个表中的每条记录重复查询?SQL Server 2012,sql-server,Sql Server,我有一个.txt文件,其中包含必须存储在表中的数据,我为此编写了一个查询 问题是有很多.txt文件,可以添加更多,我认为可以创建一个带有.txt文件名的表。我需要使用这些名称作为变量,对每个文件运行查询 这是我的代码: CREATE TABLE #textfile (line varchar(8000)) BULK INSERT #textfile FROM 'c:\MXAPT1_SNDA01_1_SSD.TXT' GO -- Now read it and insert INSE
.txt
文件,其中包含必须存储在表中的数据,我为此编写了一个查询
问题是有很多.txt
文件,可以添加更多,我认为可以创建一个带有.txt
文件名的表。我需要使用这些名称作为变量,对每个文件运行查询
这是我的代码:
CREATE TABLE #textfile (line varchar(8000))
BULK INSERT #textfile
FROM 'c:\MXAPT1_SNDA01_1_SSD.TXT'
GO
-- Now read it and insert
INSERT INTO san3parvols(disco, tipo, fecha, totcap, alloc, disp)
(SELECT
disco, tipo, fecha,
SUM(totcap) AS totcap, SUM(alloc) AS alloc,
SUM(totcap) - SUM(alloc) AS disp
FROM
(SELECT
'MXAPT1_SNDA01_TRIARA_1' as disco, 'SSD' AS tipo,
CASE
WHEN substring(line,3,4) = 'tal'
THEN 'Total Capacity'
EKSE 'Allocated'
END AS valor,
CAST(substring(line, PatIndex('%[0-9]%', line), LEN(line)) AS numeric(18,2)) AS cap,
CONVERT(DATE, getdate()) AS fecha,
CAST(CASE
WHEN substring(line, 3, 4) = 'tal'
THEN substring(line, PatIndex('%[0-9]%', line), LEN(line))
ELSE 0
END AS numeric(18,2)) AS totcap,
CAST(CASE
WHEN substring(line, 3, 4) = 'Allo'
THEN substring(line, PatIndex('%[0-9]%', line), len(line))
ELSE 0
END AS numeric(18,2)) AS alloc
FROM
#textfile
WHERE
substring(line, 3, 4) IN ('tal', 'Allo')) AS txt1
GROUP BY
disco, tipo, fecha)
-- And then clean up
DROP TABLE #textfile
GO
我知道你可以帮忙,我提前向你表示感谢
编辑
万一有人需要我向M.Ali提出的最后一个问题的答案,我将分享关于如何添加多个变量的代码
Declare @File Nvarchar(max), @sql Nvarchar(max), @name Nvarchar(max), @tipo Nvarchar(max);
Declare Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT trespar, name, tipo
FROM sanparlist
OPEN Cur
FETCH NEXT FROM Cur INTO @File, @name, @tipo
WHILE (@@FETCH_STATUS = 0)
BEGIN
TRUNCATE TABLE Textfile_Stagging_table
SET @Sql = N' BULK INSERT Textfile_Stagging_table
FROM ''' + @File + ''''
Execute sp_executesql @Sql
INSERT INTO san3parvols(disco, tipo, fecha,totcap, alloc, disp)
(SELECT disco, tipo, fecha, sum(totcap) AS totcap, sum(alloc) AS alloc,sum(totcap)-sum(alloc) AS disp FROM
(SELECT @name AS disco, @tipo AS tipo,
CASE WHEN substring(line,3,4) = 'tal'THEN 'Total Capacity' ELSE 'Allocated' END AS valor,
cast(substring(line, PatIndex('%[0-9]%', line), len(line)) AS numeric(18,2) )AS cap,
convert(DATE,getdate()) AS fecha,
cast(CASE WHEN substring(line,3,4) = 'tal'THEN substring(line, PatIndex('%[0-9]%', line), len(line)) ELSE 0 END AS numeric(18,2)) AS totcap,
cast(CASE WHEN substring(line,3,4) = 'Allo'THEN substring(line, PatIndex('%[0-9]%', line), len(line)) ELSE 0 END AS numeric(18,2)) AS alloc
FROM Textfile_Stagging_table
WHERE substring(line,3,4) in('tal','Allo')) AS txt1
GROUP BY disco, tipo, fecha)
FETCH NEXT FROM Cur INTO @File, @name, @tipo
END
CLOSE Cur
DEALLOCATE Cur;
是的,可以在表中包含文件名,并编写查询以从表中获取文本文件名并将其插入数据库
是的,可以在表中包含文件名,并编写查询以从表中获取文本文件名并将其插入数据库
也许我遗漏了什么,但我不太确定你的问题是什么。是否要将文本文件的可变集合中的数据导入数据库中的表中?是的,完全正确。如果我对每个.txt文件重复代码,我可以成功地完成此操作。挑战在于如何运行查询的次数与存储在特定表中的.txt文件名的次数相同。。就像一个循环。。非常感谢您的回答。如果你有任何想法,请告诉我。也许我遗漏了什么,但我不太确定你的问题是什么。是否要将文本文件的可变集合中的数据导入数据库中的表中?是的,完全正确。如果我对每个.txt文件重复代码,我可以成功地完成此操作。挑战在于如何运行查询的次数与存储在特定表中的.txt文件名的次数相同。。就像一个循环。。非常感谢您的回答。如果你有任何想法,请告诉我。谢谢你,阿里先生。我马上就去试试,我会让你知道它是怎么回事。。谢谢你,阿加尼特工作得很有魅力,这太完美了。。我有一个bounch.txt文件要在不同的查询中处理。。谢谢你,先生,没有问题。。如何添加更多变量来填充查询中的名称和类型?谢谢M.Ali。我马上就去试试,我会让你知道它是怎么回事。。谢谢你,阿加尼特工作得很有魅力,这太完美了。。我有一个bounch.txt文件要在不同的查询中处理。。谢谢你,先生,没有问题。。如何添加更多变量来填充查询中的名称和类型?
-- Create a Table in SQL Server
CREATE TABLE Textfile_Stagging_table (line varchar(8000))
GO
Declare @File Nvarchar(max), @sql Nvarchar(max);
Declare Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT [FileName]
FROM TxtFiles
OPEN Cur
FETCH NEXT FROM Cur INTO @File
WHILE (@@FETCH_STATUS = 0)
BEGIN
TRUNCATE TABLE Textfile_Stagging_table
SET @Sql = N' BULK INSERT Textfile_Stagging_table
FROM ''' + @File + ''''
Execute sp_executesql @Sql
-- Your original query to get data into final destination table
-- from the Stagging table can go here
-- insert into san3parvols(disco, tipo, fecha,totcap, alloc, disp)
-- Select bla bla bla
-- FROM Textfile_Stagging_table
FETCH NEXT FROM Cur INTO @File
END
CLOSE Cur
DEALLOCATE Cur;