1

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

例如,如果列名是:id、name、address..相应的表应该包含相同的列的数量和标题名称。同样,下次列号和名称可能会有所不同。

在这方面有什么帮助吗?

4

2 回答 2

3

尝试这个 :-

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 个默认参数。查看链接以获取更多详细信息。

于 2012-10-31T08:17:39.840 回答
0

你能不能从这些“动态字段名称”所在的地方从一个不同的列表中构建一个表......然后将它作为一个字符串列表推入......就像......我用颜色构建了一个表然后得到了一个名称字段现在我要把它推入一个可用于构建表格标题的字符串中......数量不限......

SELECT @Fields = coalesce(@Fields + ',', '') +  convert(varchar(50),[name])
                FROM #TempCols
                WHERE column_id > 1
                ORDER BY column_id

其中 Column_ID 只是一个 Windowed ROW_Number ...

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

于 2019-06-21T19:06:48.747 回答