SQL Server:将查询结果存储到变量中
我试图将每个人的查询结果连接到一个变量中。 光标从#temp表中提取列名,并从PersonTable中提取数据 例如:对于PID=1(FName:John LName:Hill HomeCountry=US HomeState=CH) 123johnhillschSQL Server:将查询结果存储到变量中,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我试图将每个人的查询结果连接到一个变量中。 光标从#temp表中提取列名,并从PersonTable中提取数据 例如:对于PID=1(FName:John LName:Hill HomeCountry=US HomeState=CH) 123johnhillsch Person Table: pid FName LName HomeCity HomeState 1 Pascal E New York NY 2 Steve F New
Person Table:
pid FName LName HomeCity HomeState
1 Pascal E New York NY
2 Steve F New York NY
CREATE table #Temp
([Id] int, [ColumnName] varchar(13))
;
INSERT INTO #Temp
([Id],[ColumnName])
VALUES
(1, 'EID'),
(2, 'FName'),
(3, 'LName'),
(4, 'HomeCountry'),
(5, 'HomeState')
;
SELECT * FROM #Temp
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
ALTER PROCEDURE [dbo].[up_Conv_GenerateResultsFromMappingTable]
@Param1 VARCHAR(30)
AS
SET NOCOUNT ON
DECLARE @ColName VARCHAR(100);
DECLARE @Result VARCHAR(MAX)
DECLARE @Cur as CURSOR;
SET @Cur = CURSOR FOR
SELECT columnName FROM #Temp
OPEN @Cur;
FETCH NEXT FROM @Cur INTO @ColName;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @query nvarchar(MAX)
PRINT @Param1;
SET @Query='SELECT '+@ColName+' FROM dbo.PERSON where PID='+@Param1+''
PRINT @Query
EXECUTE sp_executesql @Query
, N'@Param1 varchar(30)',
@Param1
FETCH NEXT FROM @Cur INTO @ColName;
END
CLOSE @Cur;
DEALLOCATE @Cur;
预期结果
1,1PascalENewYorkNY
2,2SteveFNewYorkNY
在SQL Server 2012+中,为什么不这样做
SELECT EID, CONCAT(EID, FName, LName, HomeCountry, HomeState) AS ConcatString, CreateDate
FROM Person
在SQLServer2008R2及以下版本中,必须
SELECT EID, CAST(EID AS VARCHAR(20) + FName + LName + HomeCountry + HomeState AS ConcatString, CreateDate
FROM Person
如果你想返回每个用户的结果,你可以参数化它,然后从源代码中单独发送EID,或者你可以使用光标…如果你没有其他选择的话。如果要返回整个数据集,可以直接使用该数据集中的数据 要连接的列是否都在同一个表中?或者它们是按您在示例中显示的方式逐行存储的吗?您可以发布示例数据和人员的预期结果吗table@RyanWilson:是,但针对每个员工按行显示。例如:输出表包含EID、Concat(EID、FName、LName、HomeState、HomeCity),CreatedOn@SQLLearner我想你已经得到了下面的答案。@scsimon:添加了Person&Output Table很好的答案。确保在使用varchar时始终指定大小。默认值可以根据使用情况而更改。就像所有事情一样,直截了当总是更好。是的,我在那件事上很懒。我继续,只是将其更改为bigint允许的最大长度。