我有一个表FieldList(ID int,Title varchar(50)),并希望为FieldList中的每个记录创建一个临时表,其列名为_ FieldList.Title,类型为varchar。
这一切都发生在存储过程中,临时表返回给客户端进行报告和数据分析。
e.g。
FieldList表:
ID标题
1个城市
2 UserSuppliedFieldName
3 SomeField
结果临时表列:
City UserSuppliedFieldName SomeField
答案 0 :(得分:0)
创建此功能并将所需的列表传递给它。它将暂时为您生成一个表,您可以与任何其他SQL查询实时使用。我也提供了一个例子。
CREATE FUNCTION [dbo].[fnMakeTableFromList]
(@List varchar(MAX), @Delimiter varchar(255))
RETURNS table
AS
RETURN (SELECT Item = CONVERT(VARCHAR, Item)
FROM (SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
FROM (SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')) AS a
CROSS APPLY [XML].nodes('i') AS x(i)) AS y
WHERE Item IS NOT NULL);
GO
你可以像这样使用它......
Parm1 =由分隔符分隔的字符串中的列表 Parm2 =分隔符
SELECT *
FROM fnMakeTableFromList('a,b,c,d,e',',')
结果是一张表...... 一个 b C d ë
答案 1 :(得分:0)
使用先前创建的表“FieldList”,其中包含字段“ID”和“标题”...
第1步:创建表格。字段“First”只有一个字段,我们将在最后删除它
create table #SOE (First varchar(50))
第2步:右键单击并选择“Result To - &gt; Result to text”,然后运行查询:
select 'alter table #SOE add ' + Title + ' varchar(50)' from dbo.FieldList
第3步:复制粘贴结果并执行
第4步:删除第一个字段
alter table #SOE drop column First
第5步:这是你的表
select * from #SOE
答案 2 :(得分:0)
您可以使用以下过程来执行您想要的操作。它只需要你:
[请务必将proc名称更改为您喜欢的任何名称,但在后面的示例中使用了temp proc名称]
CREATE PROCEDURE #Abracadabra
(
@TempTableName SYSNAME,
@DummyFieldName SYSNAME,
@TestMode BIT = 0
)
AS
SET NOCOUNT ON
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + N', [',
N'ALTER TABLE ' + @TempTableName + N' ADD [')
+ [Title]
+ N'] VARCHAR(100)'
FROM #FieldList
ORDER BY [ID]
SET @SQL = @SQL
+ N' ; ALTER TABLE '
+ @TempTableName
+ N' DROP COLUMN ['
+ @DummyFieldName
+ N'] ; '
IF (@TestMode = 0)
BEGIN
EXEC(@SQL)
END
ELSE
BEGIN
PRINT @SQL
END
GO
以下示例显示了正在使用的proc。第一次执行是在测试模式下,它只打印将要执行的SQL。第二次执行运行SQL和SELECT,然后EXEC显示字段是FieldList表中的字段。
/*
-- HIGHLIGHT FROM "SET" THROUGH FINAL "INSERT" AND RUN ONCE
-- to setup the example
SET NOCOUNT ON;
--DROP TABLE #FieldList
CREATE TABLE #FieldList (ID INT, Title VARCHAR(50))
INSERT INTO #FieldList (ID, Title) VALUES (1, 'City')
INSERT INTO #FieldList (ID, Title) VALUES (2, 'UserSuppliedFieldName')
INSERT INTO #FieldList (ID, Title) VALUES (3, 'SomeField')
*/
IF (OBJECT_ID('tempdb.dbo.#Tmp') IS NOT NULL)
BEGIN
DROP TABLE #Tmp
END
CREATE TABLE #Tmp (Dummy INT)
EXEC #Abracadabra
@TempTableName = N'#Tmp',
@DummyFieldName = N'Dummy',
@TestMode = 1
-- look in "Messages" tab
EXEC #Abracadabra
@TempTableName = N'#Tmp',
@DummyFieldName = N'Dummy',
@TestMode = 0
SELECT * FROM #Tmp
@TestMode = 1
的输出:
ALTER TABLE #Tmp ADD [City] VARCHAR(100),[UserSuppliedFieldName] VARCHAR(100),[SomeField] VARCHAR(100); ALTER TABLE #Tmp DROP COLUMN [假];