我想创建一个临时表,其中列将是我作为参数提供的列,由分隔符分隔。
例如,如果列名是:id,name,address ..相应的表应包含相同的数量和列的标题名称。同样,下次列号和名称可能会有所不同。
在这方面有任何帮助吗?
答案 0 :(得分: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个默认参数。查看this链接以获取更多详细信息。
答案 1 :(得分:0)
您是否可以从这些“动态字段名称”所在的位置创建一个不在列表之外的表格?然后将其作为字符串列表推入...就像...我用颜色创建了一个表格然后得到了一个名称字段,现在将其推入可用于构建表头的字符串...对数量没有限制...
SELECT @Fields = coalesce(@Fields + ',', '') + convert(varchar(50),[name])
FROM #TempCols
WHERE column_id > 1
ORDER BY column_id
其中Column_ID只是一个窗口的ROW_Number ...
我不同意它永远不可能的观点。总有一种方法,我们现在可能看不到,但是总有一种方法可以嵌套或滥用,以使任何规则都符合我们的需要。