我不熟悉使用游标在一组行之间循环。但是到目前为止,我已经对要阅读的专栏有所了解。
例如
DECLARE db_cursor FOR
SELECT Column1, Column2
FROM MyTable
DECLARE @ColumnOne VARCHAR(50), @ColumnTwo VARCHAR(50)
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @ColumnOne, @ColumnTwo
...
但是我要读入键/值表的表没有特定的结构,我应该能够一次处理它们。如何使用嵌套游标遍历提取行的所有列并根据其类型和名称对其进行处理?
答案 0 :(得分:1)
TSQL游标并不是真正为从结构未知的表中读取数据而设计的。我可以想到的朝着这个方向发展的两种可能性是:
SELECT * FROM TABLE_NAME FOR XML AUTO
并根据您的目的进一步处理检索到的数据(请参见FOR XML (SQL Server))。答案 1 :(得分:1)
SQL在处理集合方面不是很好。在大多数情况下,您必须事先知道列名,数据类型等等。但是有XQuery。您可以轻松地将任何SELECT
转换为XML,并使用强大的功能来处理那里的通用结构。我不建议这样做,但可能值得尝试:
CREATE PROCEDURE dbo.Get_EAV_FROM_SELECT
(
@SELECT NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @tmptbl TABLE(TheContent XML);
DECLARE @cmd NVARCHAR(MAX)= N'SELECT (' + @SELECT + N' FOR XML RAW, ELEMENTS XSINIL);';
INSERT INTO @tmptbl EXEC(@cmd);
SELECT r.value('*[1]/text()[1]','nvarchar(max)') AS RowID
,c.value('local-name(.)','nvarchar(max)') AS ColumnKey
,c.value('text()[1]','nvarchar(max)') AS ColumnValue
FROM @tmptbl t
CROSS APPLY t.TheContent.nodes('/row') A(r)
CROSS APPLY A.r.nodes('*[position()>1]') B(c)
END;
GO
EXEC Get_EAV_FROM_SELECT @SELECT='SELECT TOP 10 o.object_id,o.* FROM sys.objects o';
GO
--Clean-Up for test purpose
DROP PROCEDURE Get_EAV_FROM_SELECT;
简而言之
sys.objects
),我们可以编写SELECT并以这种方式强制执行。SELECT
将读取每一行并返回经典的EAV列表。