【问题标题】:SQL dynamically store data from a database to anotherSQL 动态地将数据从一个数据库存储到另一个数据库
【发布时间】:2015-08-05 11:02:33
【问题描述】:

我正在构建一个 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

所以我启动了一个游标 Data,它使用 N#ºContabEFA 数据库中的表 Eventos 获取所有行

然后我启动另一个游标 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_BiografiaL_7AssociadosAPDDEMO 数据库中。

问题是,当我得到列名时,那是一个字符串。我在动态 SELECT 查询上进行连接,我得到了 SELECT 输出,但没有得到我需要的值本身。

因此,如果我尝试获取作为第一列的列 Active,它包含值 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 中检索值?

【问题讨论】:

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


    【解决方案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 中的 Select 之后添加了输出变量 @Observacoes =

    原因是当您在声明中添加outputsp_executesql 时,它不会自动将选择结果存储到输出变量中。您仍然必须将其设置为 somthing...

    【讨论】:

    • TY 回答 Julien 但这不是我需要的,因为列不匹配所以我不能使用直接插入。我只需要检索列名及其值并将其分配给具有不同名称的其他列。唯一的问题是我可以检索列名,但我不能直接选择它的值,因为查询假定它是一个字符串。所以我使用动态 SELECT 查询来获取它,但输出仍然无效。我只是希望能够使用SELECT EFA..Eventos.' + @ColName + ' FROM EFA..Eventos WHERE EFA..Eventos.N#ºContab = ' + @N#ºContab 并获得价值作为回报。
    • 非常感谢您的第一个解决方案解决了问题,现在我得到了我需要的值。我只是在插入之前添加了一个删除,因为它正在插入新值并且表变得更大并且抛出错误。但现在它的工作谢谢你= D。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2012-11-27
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多