我使用PLC连接到SQL数据库,需要返回值列表。不幸的是,PLC的内存有限,并且一次只能检索大约5,000个值,但数据库最多可包含10,000个值。
因此我需要一种在2个操作中检索这些值的方法。不幸的是,PLC在它可以执行的查询中受到限制,并且仅限于SELECT和WHERE命令,所以我不能使用LIMIT或TOP或类似的东西。
有没有办法可以创建视图,并自动为该视图中的每个字段编号?然后我可以查询所有记录< 5,000,然后第二次查询< 10,000等?
不幸的是,似乎视图不支持标识列,因此需要手动完成。
有人有什么建议吗?我目前唯一的现实选择似乎是创建2个视图,一个是前5,000个,另一个是下一个5,000 ...
我正在使用SQL Server 2000,如果这有所不同......
答案 0 :(得分:0)
有两种解决方案。最简单的方法是修改SQL表并添加IDENTITY
列。如果这不可能,那么你将不得不做类似下面的查询。对于10000行,它不应该太慢。但随着桌子的增长,它会变得越来越糟糕。
SELECT Col1, Col2, (SELECT COUNT(i.Col1)
FROM yourtable i
WHERE i.Col1 <= o.Col1) AS RowID
FROM yourtable o
答案 1 :(得分:0)
虽然Derek提供的代码按照我的要求进行 - 即视图中每一行的编号,但是性能非常差 - 大约20秒到100行。因此,它不是一个可行的解决方案。另一种方法是将前5,000个记录编号为1,将下一个5,000记录编号为2.这可以通过3个简单查询来完成,并且执行起来要快得多。
执行此操作的代码如下:
SELECT TOP(5000) BCode, SAPCode, 1 as GroupNo FROM dbo.DB
UNION
SELECT TOP (10000) BCode, SAPCode, 2 as GroupNo FROM dbo.DB p
WHERE ID NOT IN (SELECT TOP(5000) ID FROM dbo.DB)
虽然正如Andriy M所指出的那样,你也应该指明一个明确的排序,以确保你不会错过任何记录。
答案 2 :(得分:0)
一种可能性是使用带有临时表的函数,例如
CREATE FUNCTION dbo.OrderedBCodeData()
RETURNS @Data TABLE (RowNumber int IDENTITY(1,1),BCode int,SAPCode int)
AS
BEGIN
INSERT INTO @Data (BCode,SAPCode)
SELECT BCode,SAPCode FROM dbo.DB ORDER BY BCode
RETURN
END
并从此功能中选择,例如
SELECT FROM dbo.OrderedBCodeData() WHERE RowNumber BETWEEN 5000 AND 10000
我从来没有在生产中使用它,事实上今天早上只是一个简单的想法,但值得探索作为一个更好的选择?