Sql 从提供的变量列名创建临时表
我想创建一个临时表,其中的列将是我作为参数提供的列,用分隔符分隔 例如,如果列名为:id、name、address..,则相应的表应包含相同的列的金额和标题名。类似地,下一次列的编号和名称可能会有所不同 这方面有什么帮助吗?试试这个:-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
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时,必须指定参数。