【问题标题】:Create a table in SQL Server from a tables values从表值在 SQL Server 中创建表
【发布时间】:2014-06-06 10:15:47
【问题描述】:

好的,请留在我这里,看看是否有人知道这是否可以做到。 我最初查询一个表只带回 1 行,该行包含我将使用的数据。 我需要做的是,将该 1 行转换为每个列值与列名对齐的表。

所以我查询一个表以获得 1 行,比如说一个名为颜色的表,其中有列名称、色调、人口。

我需要让那 1 行成为一个表格,其中的值可以说:

Red, 50, Super Popular

变成一张桌子:

Name, Red
Hue, 50
Populatiry, Super Popular

我基本上使用一个函数来用它的实际值替换一个字符串值(作为列名输入),我不能使用 exec 命令,因为函数不允许它,它必须是一个函数,因为我选择了那个将字符串直接返回到过程中:

这是我在发现 exec 命令停止它作为函数工作之前所拥有的代码

CREATE FUNCTION  [dbo].[GetOutlookTrainingBodyText]
(
    @ScheduleID bigint
)
RETURNS nvarchar(300)
AS
BEGIN

    declare c cursor local fast_forward
    for
    SELECT Label, Name, QueryField
    FROM IntranetPagesx ipx
    INNER JOIN IntranetPageLayoutx ipl on ipl.PageID = ipx.PageID
    WHERE ipx.PageID = 'Training Attendance'

    declare @name nvarchar (100)
    declare @name1 nvarchar (100)
    declare @label nvarchar (100)
    declare @queryfield nvarchar (200)
    declare @sql nvarchar (1000)
    declare @BodyText nvarchar(500) = (SELECT dbo.GetValidSystemPropertyValue('OutlookIntegrationTrainingBodyTextTemplate'))

    open c
    fetch next from c into @label, @name, @queryfield

    while @@FETCH_STATUS = 0
    begin

        SET @sql = 'SELECT TOP 1 @name1= '+@queryfield+' FROM TRAINING_AttendanceConfirmed WHERE ScheduleID = ''246'''
        EXEC sp_executesql @sql,N'@name1 nvarchar(200) out', @name1 out
        set @BodyText = Replace(@BodyText, '#'+@label+'#', (ISNULL(@name1, '')))

    fetch next from c into @label, @name, @queryfield
    END
    CLOSE c
    DEALLOCATE c

    PRINT @BodyText
return (@BodyText)

END

我需要不使用 exec 的等效工作 - 可以这样做吗????

【问题讨论】:

  • 如果我理解得很好,Label 是您想要的字段名称,QueryField 是表中值所在的列。我说的对吗?

标签: sql-server function tsql join


【解决方案1】:

xml 可以提供一些灵活性来处理列名和值,如下所示:

SELECT 
CAST(CAST((SELECT TOP 1 * FROM colours FOR XML PATH('')) AS XML).query('fn:local-name(*[1]/.)') AS VARCHAR(100)) colname,
CAST(CAST((SELECT TOP 1 * FROM colours FOR XML PATH('')) AS XML).query('*[1]/text()') AS VARCHAR(100)) value
UNION
SELECT 
CAST(CAST((SELECT TOP 1 * FROM colours FOR XML PATH('')) AS XML).query('fn:local-name(*[2]/.)') AS VARCHAR(100)) colname,
CAST(CAST((SELECT TOP 1 * FROM colours FOR XML PATH('')) AS XML).query('*[2]/text()') AS VARCHAR(100)) value
UNION
SELECT 
CAST(CAST((SELECT TOP 1 * FROM colours FOR XML PATH('')) AS XML).query('fn:local-name(*[3]/.)') AS VARCHAR(100)) colname,
CAST(CAST((SELECT TOP 1 * FROM colours FOR XML PATH('')) AS XML).query('*[3]/text()') AS VARCHAR(100)) value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2010-11-23
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多