Sql 从提供的变量列名创建临时表

Sql 从提供的变量列名创建临时表,sql,sql-server,insert,temp-tables,Sql,Sql Server,Insert,Temp Tables,我想创建一个临时表,其中的列将是我作为参数提供的列,用分隔符分隔 例如,如果列名为:id、name、address..,则相应的表应包含相同的列的金额和标题名。类似地,下一次列的编号和名称可能会有所不同 这方面有什么帮助吗?试试这个:- CREATE PROCEDURE GenerateTempTable @tableName as nvarchar(max), @Col1 as nvarchar(255), @Col2 as nvarchar(255) AS BEGIN Declare @s

我想创建一个临时表,其中的列将是我作为参数提供的列,用分隔符分隔

例如,如果列名为:id、name、address..,则相应的表应包含相同的列的金额和标题名。类似地,下一次列的编号和名称可能会有所不同

这方面有什么帮助吗?

试试这个:-

CREATE PROCEDURE GenerateTempTable 
@tableName as nvarchar(max),
@Col1 as nvarchar(255),
@Col2 as nvarchar(255)
AS
BEGIN
Declare @sql nvarchar(max)

set @sql='CREATE TABLE #'+ @tableName  + '
         ('+ @col1+ ' nvarchar(255),'+
          @col2 + ' nvarchar(255)
         )'

-- Select @sql   Check the DDL 

EXECUTE sp_executesql @sql,
N'@tableName nvarchar(max),@Col1 nvarchar(255),@Col2 nvarchar(255)',
@tableName = @tableName,@Col1=@Col1,@Col2=@Col2 


END
上述查询的问题是,临时表是使用动态块查询创建的,因此无法在块之后访问它。为了访问范围外的表,您需要创建
global temp table##

编辑:- 具有全局临时表和静态表名的示例

ALTER PROCEDURE GenerateTable 
@Col1 as nvarchar(255),
@Col2 as nvarchar(255)
AS
BEGIN
Declare @sql nvarchar(max)

If object_id('tempdb..##TempTable') is not null 
Drop table ##TempTable

set @sql='CREATE TABLE ##TempTable 
        ('+ @col1+ ' nvarchar(255),'+
        @col2 + ' nvarchar(255)
        )'

-- Select @sql   Check the DDL 

 EXECUTE sp_executesql @sql,
 N'@Col1 nvarchar(255),@Col2 nvarchar(255)',
 @Col1=@Col1,@Col2=@Col2 

 END
要执行SP,sql为:-

 Declare @tableName varchar(max),
 @Col1 varchar(70),
 @Col2 varchar(70)

 Exec GenerateTable @col1='ColA',@Col2='ColB'
编辑2:-


如果您确定参数的数量不会超过x值(比如5),那么您可以创建5个默认参数。有关更多详细信息,请查看链接。

您是否可以从这些“动态字段名”所在的位置使用不同的列表构建表。。。然后将其作为字符串列表推入。。。喜欢我用颜色构建了一个表,然后得到了一个名称字段,现在我将把它推到一个字符串中,可以用来构建表头。。。数量不限

SELECT @Fields = coalesce(@Fields + ',', '') +  convert(varchar(50),[name])
                FROM #TempCols
                WHERE column_id > 1
                ORDER BY column_id
其中列ID只是一个窗口行编号


我不同意“永远不可能”的观点。总有办法,我们现在可能看不到它,但总有一种方法可以嵌套或滥用,以使任何规则符合我们的需要。

如何识别列的数据类型?您不能从一个诱人的转换到一个标准的吗?@EdHarper simple varchar现在就足够了。@mCasamento我只需要一个表,可以用来连接其他列表当我有必要的数据时,您可以创建一个包含50列的表变量。我认为这种方法没有任何错误。而是创建一个动态临时表,我认为它不起作用,因为您需要创建更多全局临时表,随着使用动态查询创建的复杂性的增加,非常感谢,但在这里,我看到您正在设置硬编码列,即Col1和Col2,我需要@columns='Name,Address,Email'…任何帮助?当您执行SP时,您将传递列名。请参考我的更新答案您的方法将我限制为只传递2列,我想要一个具有动态列数的表,其中,我可以将列名作为参数传递给sp。参数的数量不能是动态的。创建sp时,必须指定参数。