让我简单举一个例子。我们说我保存了以下查询:
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(如上例所示)并拥有其余的查询从那里拉出来。
请注意。我无法在使用过的数据库中创建表或数据库。
答案 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作为简单文本参数传递。