【问题标题】:Insert each table record into 1 column将每个表记录插入 1 列
【发布时间】:2018-01-09 02:40:43
【问题描述】:

我是 SQL Server 新手,所以请多多包涵。

我正在尝试编写一个存储过程,将所有记录插入到临时表的单个列中。

表#1

column1       column2       column3
-------       -------       -------
record1       record2       record3
record4       record5       record6

表#2(已编辑)

column1    original_field    data_type
-------    --------------    ---------
record1       column1         nvarchar
record2       column2         nvarchar
record3       column3         nvarchar
record4       column1         nvarchar
record5       column2         nvarchar
record6       column3         nvarchar

现在我的问题是 table#1 不是静态的,因此每次执行过程时列数可能会发生变化。

【问题讨论】:

  • 你知道程序可以返回的最大列数吗?
  • 1 列。该过程应该返回一个 XML 字符串。但我目前正在尝试做的是将所有这些记录合并到一个临时表中。
  • @JoshuaPena 所以你想知道如何将所有记录合并到一个表中的代码?
  • 那不是我的问题。既然您提到了“每次执行的列数可能会改变”,您知道过程可以返回的最大列数吗?
  • @Pரதீப் 不,我还不知道。我目前正在处理具有 4-25 列的表。抱歉,我是 SQL Server 的新手,所以我仍然感到困惑。

标签: sql-server


【解决方案1】:

这对你这样的人来说有很多问题,但这里有一个解决方案。

我建议使用cursors 解决您的问题。

Cursors基本上是SQL的while循环。

这个例子也用到了动态SQL的原理,大家不妨研究一下。

请将testtb1的名称更改为您要获取信息的表的列名。

请将testDB2的名称更改为您要放置数据的表,将newcol1更改为表的列名称testDB2,即您要插入收集的数据的列.

declare @TSQL as nvarchar(max)
declare @colname as nvarchar(50)
declare @cursor CURSOR
SET @cursor = CURSOR FOR 
(select [name] from sys.columns where object_id = (select object_id  from sys.tables where name = 'testtb1'))


OPEN @cursor

FETCH NEXT

FROM @cursor INTO @colname
WHILE @@FETCH_STATUS = 0
BEGIN

    set @TSQL = 'insert into testDB2 (newcol1)
    select '+@colname+' from testtb1'

    exec sp_executesql @TSQL, N'@colname nvarchar(50)', @colname
FETCH NEXT

FROM @cursor INTO @colName
END

CLOSE @cursor
DEALLOCATE @cursor

【讨论】:

  • 谢谢。非常适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2016-01-17
  • 2020-08-04
  • 1970-01-01
  • 2019-12-26
  • 2012-05-11
  • 2014-08-06
相关资源
最近更新 更多