Sql server 如何按行表创建临时表和动态字段?

Sql server 如何按行表创建临时表和动态字段?,sql-server,stored-procedures,Sql Server,Stored Procedures,我想在MS-SQL上创建临时表,但通过其他行数据创建字段 表十 FieldA ======= SkillA SkillB SkillC 临时表 SkillA SkillB SkillC ============================ Null Null Null 谢谢你的帮助 我想在服务器端执行。我不知道行数据的数量。 我扩展 TABLE X FieldA FieldB =================== SKillA

我想在MS-SQL上创建临时表,但通过其他行数据创建字段

表十

FieldA 
=======
SkillA
SkillB
SkillC
临时表

SkillA     SkillB    SkillC
============================
Null         Null       Null
谢谢你的帮助

我想在服务器端执行。我不知道行数据的数量。 我扩展

TABLE X
FieldA    FieldB
===================
 SKillA    SubjectA
 SkillB    SubjectB
 SkillC    SubjectC
...
...
*** I don't know amount row data ***

Temp Table
SkillA   SubjectA   SkillB   SubjectB  SkillC  SubjectC
========================================================
非常感谢。

试试这个-

查询:

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

DECLARE @temp TABLE (FieldA NVARCHAR(50))
INSERT INTO @temp (FieldA)
VALUES 
    ('SkillA'),
    ('SkillB'),
    ('SkillC')

SELECT *
INTO #temp
FROM (
    SELECT FieldA, a = CAST(NULL AS INT) 
    FROM @temp
) src
PIVOT 
(
    MAX(a) 
    FOR FieldA IN (SkillA, SkillB, SkillC)
) unpvt

SELECT * 
FROM #temp t
SkillA      SkillB      SkillC
----------- ----------- -----------
NULL        NULL        NULL
IF OBJECT_ID (N'tempdb.dbo.##temp') IS NOT NULL
   DROP TABLE ##temp

DECLARE @temp TABLE (FieldA VARCHAR(20), FieldB VARCHAR(20))
INSERT INTO @temp (FieldA, FieldB)
VALUES 
    ('SKillA', 'SubjectA'),
    ('SkillB', 'SubjectB'),
    ('SkillC', 'SubjectC')

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT * 
    INTO ##temp 
    FROM (
    SELECT ' + STUFF((
    SELECT DISTINCT ', [' + FieldA + '] = NULL, [' + FieldB + '] = NULL'
    FROM @temp
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ') t 
    WHERE 1 != 1'

EXEC sys.sp_executesql @SQL

SELECT * 
FROM ##temp t
SKillA      SubjectA    SkillB      SubjectB    SkillC      SubjectC
----------- ----------- ----------- ----------- ----------- -----------
输出:

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

DECLARE @temp TABLE (FieldA NVARCHAR(50))
INSERT INTO @temp (FieldA)
VALUES 
    ('SkillA'),
    ('SkillB'),
    ('SkillC')

SELECT *
INTO #temp
FROM (
    SELECT FieldA, a = CAST(NULL AS INT) 
    FROM @temp
) src
PIVOT 
(
    MAX(a) 
    FOR FieldA IN (SkillA, SkillB, SkillC)
) unpvt

SELECT * 
FROM #temp t
SkillA      SkillB      SkillC
----------- ----------- -----------
NULL        NULL        NULL
IF OBJECT_ID (N'tempdb.dbo.##temp') IS NOT NULL
   DROP TABLE ##temp

DECLARE @temp TABLE (FieldA VARCHAR(20), FieldB VARCHAR(20))
INSERT INTO @temp (FieldA, FieldB)
VALUES 
    ('SKillA', 'SubjectA'),
    ('SkillB', 'SubjectB'),
    ('SkillC', 'SubjectC')

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT * 
    INTO ##temp 
    FROM (
    SELECT ' + STUFF((
    SELECT DISTINCT ', [' + FieldA + '] = NULL, [' + FieldB + '] = NULL'
    FROM @temp
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ') t 
    WHERE 1 != 1'

EXEC sys.sp_executesql @SQL

SELECT * 
FROM ##temp t
SKillA      SubjectA    SkillB      SubjectB    SkillC      SubjectC
----------- ----------- ----------- ----------- ----------- -----------
更新2:我不知道行数据的数量

查询:

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

DECLARE @temp TABLE (FieldA NVARCHAR(50))
INSERT INTO @temp (FieldA)
VALUES 
    ('SkillA'),
    ('SkillB'),
    ('SkillC')

SELECT *
INTO #temp
FROM (
    SELECT FieldA, a = CAST(NULL AS INT) 
    FROM @temp
) src
PIVOT 
(
    MAX(a) 
    FOR FieldA IN (SkillA, SkillB, SkillC)
) unpvt

SELECT * 
FROM #temp t
SkillA      SkillB      SkillC
----------- ----------- -----------
NULL        NULL        NULL
IF OBJECT_ID (N'tempdb.dbo.##temp') IS NOT NULL
   DROP TABLE ##temp

DECLARE @temp TABLE (FieldA VARCHAR(20), FieldB VARCHAR(20))
INSERT INTO @temp (FieldA, FieldB)
VALUES 
    ('SKillA', 'SubjectA'),
    ('SkillB', 'SubjectB'),
    ('SkillC', 'SubjectC')

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT * 
    INTO ##temp 
    FROM (
    SELECT ' + STUFF((
    SELECT DISTINCT ', [' + FieldA + '] = NULL, [' + FieldB + '] = NULL'
    FROM @temp
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ') t 
    WHERE 1 != 1'

EXEC sys.sp_executesql @SQL

SELECT * 
FROM ##temp t
SKillA      SubjectA    SkillB      SubjectB    SkillC      SubjectC
----------- ----------- ----------- ----------- ----------- -----------
输出:

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

DECLARE @temp TABLE (FieldA NVARCHAR(50))
INSERT INTO @temp (FieldA)
VALUES 
    ('SkillA'),
    ('SkillB'),
    ('SkillC')

SELECT *
INTO #temp
FROM (
    SELECT FieldA, a = CAST(NULL AS INT) 
    FROM @temp
) src
PIVOT 
(
    MAX(a) 
    FOR FieldA IN (SkillA, SkillB, SkillC)
) unpvt

SELECT * 
FROM #temp t
SkillA      SkillB      SkillC
----------- ----------- -----------
NULL        NULL        NULL
IF OBJECT_ID (N'tempdb.dbo.##temp') IS NOT NULL
   DROP TABLE ##temp

DECLARE @temp TABLE (FieldA VARCHAR(20), FieldB VARCHAR(20))
INSERT INTO @temp (FieldA, FieldB)
VALUES 
    ('SKillA', 'SubjectA'),
    ('SkillB', 'SubjectB'),
    ('SkillC', 'SubjectC')

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT * 
    INTO ##temp 
    FROM (
    SELECT ' + STUFF((
    SELECT DISTINCT ', [' + FieldA + '] = NULL, [' + FieldB + '] = NULL'
    FROM @temp
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ') t 
    WHERE 1 != 1'

EXEC sys.sp_executesql @SQL

SELECT * 
FROM ##temp t
SKillA      SubjectA    SkillB      SubjectB    SkillC      SubjectC
----------- ----------- ----------- ----------- ----------- -----------

你能再解释一下你想做什么吗。也许有一个实际的例子。使用PIVOT,但这样你仍然需要知道你的行,对吗?如果我们不知道我们想要创造多少“技能N”呢?