嗨,大家好我是新来的,我需要你的帮助。 我正在构建一个sql查询,其目的是将数据从导入的数据库从excel文件获取到将保存该信息的现有数据库。 我不想为此构建LINQ查询。我想构建一个本机SQL查询。
查询只有问题。让我们进入^^。
DECLARE Data CURSOR FOR
SELECT [N#ºContab] FROM EFA..Eventos
DECLARE @N#ºContab NVARCHAR(200)
DECLARE @AssociadoId INT
DECLARE @LoopNum INT = 0
DECLARE @LoopRows INT
OPEN Data
SET @LoopRows = @@CURSOR_ROWS
WHILE @@FETCH_STATUS = 0
BEGIN
IF @LoopNum = @LoopRows BREAK
FETCH NEXT FROM Data INTO @N#ºContab
SET @AssociadoId = (SELECT Id FROM L_7AssociadosAPDDEMO..L_Associado WHERE Numero = @N#ºContab)
USE EFA
DECLARE @ColNum INT = 1
DECLARE @ColRows INT
DECLARE ColNames CURSOR FOR
SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Eventos'
ORDER BY ordinal_position
OPEN ColNames
SET @ColRows = @@CURSOR_ROWS
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @ColName VARCHAR(200)
DECLARE @SQLQuery NVARCHAR(MAX)
DECLARE @Temp NVARCHAR(MAX)
DECLARE @Observacoes VARCHAR(MAX)
IF @ColNum = @ColRows BREAK
FETCH ColNames
INTO @ColName
SET @SQLQuery = N'SELECT EFA..Eventos.' + @ColName + ' FROM EFA..Eventos WHERE EFA..Eventos.N#ºContab = ' + @N#ºContab
EXECUTE sp_executesql @SQLQuery, N'@Observacoes VARCHAR(MAX) OUTPUT', @Observacoes OUTPUT;
INSERT INTO L_7AssociadosAPDDEMO..L_Biografia (L_AssociadoId, Descricao, Observacoes, Data, DataCriacao, DataUltimaActualizacao)
VALUES (@AssociadoId, @ColName, @Observacoes, '1900-01-01 00:00:00', '1900-01-01 00:00:00', '1900-01-01 00:00:00')
SET @ColNum = @ColNum + 1
END
CLOSE ColNames
DEALLOCATE ColNames
SET @LoopNum = @LoopNum + 1
END
PRINT 'DONE'
CLOSE Data
DEALLOCATE Data
所以我启动了一个光标数据,它使用 N#ºContab从 EFA数据库中的表 Eventos 获取所有行
然后我启动另一个Cursor ColNames 以从 EFA数据库中获取表Eventos中的所有列名,以便我可以从该列获取列名和值。
DECLARE ColNames CURSOR FOR
SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Eventos'
ORDER BY ordinal_position
主要原因是我可以获取列名并将其存储在名为 Descricao 的列中,并将值存储在表名中名为 Observacoes 的列上 L_7AssociadosAPDDEMO 数据库中的L_Biografia 。
问题是,当我得到一个字符串的列名称并且我在动态SELECT查询上连接时,我得到SELECT输出但不是我需要的值本身。 因此,如果我尝试将列有效作为第一列,则它包含值 1 。我想检索该值 1 ,但我得到一个SELECT输出。所以变量 @Observacoes 是一个nvarchar类型,因此它不会得到输出,它会变空。
所以我陷入了这里
SET @SQLQuery = N'SELECT EFA..Eventos.' + @ColName + ' FROM EFA..Eventos WHERE EFA..Eventos.N#ºContab = ' + @N#ºContab
EXECUTE sp_executesql @SQLQuery, N'@Observacoes VARCHAR(MAX) OUTPUT', @Observacoes OUTPUT;
查询工作应该有效。我唯一得到的是当我执行动态SELECT时的值。
那么我该怎么做才能从使用sp_executesql输出动态构建的SELECT ive中检索值?
提前谢谢你们。如果您需要更多信息,请询问。
答案 0 :(得分:1)
如果您的动态查询返回X行,请使用:
您可以创建一个表变量,用于存储自定义列
中的字符串值DECLARE @table AS Table (value nvarchar(max))
然后添加:
Insert into @table(value) Execute sp_executesql @SQLQuery...
并使用或查询
Select value From @table
如果您只从动态查询中获得1个值,请使用:
SET @SQLQuery = N'SELECT @Observacoes = EFA..Eventos.' + @ColName + ' FROM EFA..Eventos WHERE EFA..Eventos.N#ºContab = ' + @N#ºContab
EXECUTE sp_executesql @SQLQuery, N'@Observacoes VARCHAR(MAX) OUTPUT', @Observacoes OUTPUT;
Select @Observacoes...
我刚刚在@SQLQuery中选择后添加了输出变量 @Observacoes = 。
原因是当您在声明和output
中添加sp_executesql
时,它不会自动将select的结果存储到输出变量中。你仍然需要把它设置为某事......