【发布时间】: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