有没有办法从.sql文件中提取部分SQL查询?

时间:2018-01-11 13:37:34

标签: sql sql-server

让我简单举一个例子。我们说我保存了以下查询: C:\sample.sql

grp.id IN 
(001   --Bob
,002   --Tom
,003   --Fay
)

现在,这组ID可能会发生变化,但不是在与其相关的每个查询中更新这些ID,而是希望只更新sample.sql,其余查询将从那个SQL文件直接。

例如,我有几个查询会有这样的部分:

SELECT *
FROM GROUP grp
WHERE grp.DATERANGE >= '2017-12-01 AND grp.DATERANGE <= '2017-12-31
AND -- **this is where I would need to insert that query (ie. C:\sample.sql)**

更多解释更新: 问题:我有几个报告/查询具有相同的ID过滤器(这些报告之间唯一的共同点)

需要什么:我不知道每次更改每个报告时都更新这些ID,我想知道我是否可以在其自己的SQL文件中更新这些ID(如上例所示)并拥有其余的查询从那里拉出来。

请注意。我无法在使用过的数据库中创建表或数据库。

3 个答案:

答案 0 :(得分:1)

也许批量插入实用程序可以提供帮助。将数据保存在csv文件中,并在运行时将它们加载到临时表中。使用这些临时表来驱动您的查询。

CREATE TABLE #CsvData(
  Column1 VARCHAR(40),
  Column2 VARCHAR(40)
)
GO

BULK
INSERT #CsvData
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO

--Use #CsvData to drive your query
SELECT *
FROM #CsvData

答案 1 :(得分:0)

也许您可以使用CTE(公用表表达式)来使用附加查询来提取ID,特别是如果您只具有读取权限。它看起来像这样:

WITH myIDs AS (select IDs from grp where (conditions to get the IDs))

SELECT *
FROM grp
WHERE grp.DATERANGE BETWEEN '2017-12-01 AND '2017-12-31'
AND IDs in (select * from myIDs)

我已将日期语法更改为使用BETWEEN,因为它更实用,但只有在您拥有SQL Server 2008或更高版本时才有效

希望这有帮助! 干杯!

答案 2 :(得分:0)

从文本片段中构建查询的唯一机会是动态SQL:

试试这个:

meta->timing

返回所有sys.object条目的列表

现在我将DECLARE @SomeCommand VARCHAR(MAX)='SELECT * FROM sys.objects'; EXEC(@SomeCommand); 子句附加到字符串

WHERE

你的结果会减少。

另一个选项是带有CSV参数的动态输入列表

这是禁止的:SET @SomeCommand=@SomeCommand + ' WHERE object_id IN(1,2,3,4,5,6,7,8,9)'; EXEC(@SomeCommand); 并像DECLARE @idList VARCHAR(100)='1,2,3,4'一样使用它 但这有效:

IN (@idList)

使用DECLARE @idList VARCHAR(100)='1,2,3,4,5,6,7,8,9'; SELECT sys.objects.* FROM sys.objects --use REPLACE to transform the list to <x>1</x><x>2</x>... OUTER APPLY(SELECT CAST('<x>' + REPLACE(@idList,',','</x><x>') + '</x>' AS XML)) AS A(ListSplitted) --Now use the XML (the former CSV) within your IN() as set-based filter WHERE @idList IS NULL OR LEN(@idList)=0 OR object_id IN(SELECT B.v.value('.','int') FROM ListSplitted.nodes('/x') AS B(v)); 可以更轻松地使用SQL Server 2016+版本。

此方法允许您将id-list作为简单文本参数传递。