SQL将数据从数据库动态存储到另一个数据库

时间:2015-08-05 11:02:34

标签: sql sql-server sql-server-2012

嗨,大家好我是新来的,我需要你的帮助。 我正在构建一个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中检索值?

提前谢谢你们。如果您需要更多信息,请询问。

1 个答案:

答案 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的结果存储到输出变量中。你仍然需要把它设置为某事......