我正在研究sql存储过程,我得到了一些问题描述如下:
工作流程
声明表名@summaryTable
DECLARE @summaryTable table (
id int identity(1,1),
)
然后进行查询,然后将数据插入表@summaryTable
,代码如下:
set @query = "Select * from Foo"
insert into @summaryTable exec(@query)
问题
当我打印print @summaryTable
这样的表名时,只需给我一个
错误
`Msg 137, Level 16, State 1, Procedure summaryReportExport, Line 71
Must declare the scalar variable "@summaryTable".`
实际上我需要在创建 .csv 文件时使用上面的表名,例如
Declare @resultSet nvarchar(max)
set @resultSet = "Select foo from '+@summaryTable"
Declare @sql varchar(8000) set @sql = 'xp_cmdshell '
Declare @fileName varchar(8000) set @fileName = 'c:/test.csv'
set @sql = @sql + '''' + ' bcp "' + @resultSet+'"' +' queryout '+ @fileName +' -T -c -t,' + '''' ;
print @sql
EXEC (@sql)
任何帮助都会受到赞赏吗?
答案 0 :(得分:2)
临时表有不同的风格,包括本地临时表(以#
开头),全局临时表(以##
开头),持久临时表(以TempDB为前缀..)和表变量。(以(@
)
如果我们用@tableName
声明它然后它作为变量起作用它应该是query的一部分。表变量在定义它们的例程或批处理的范围内使用
DECLARE @summaryTable table (
id int identity(1,1),
)
如果您声明#tableName
它只是本地表,那么您可以将它用于此会话。使用本地临时表(以#
开头的名称),引擎盖下的内容令人惊讶地类似于表变量。与表变量一样,本地临时表对创建它的进程是私有的。因此,它们不能在视图中使用,也不能将触发器与它们关联
CREATE TABLE #summaryTable (
id int identity(1,1),
)
如果你声明##tableName
它是任何人可以用于此会话的平均全局表。就像创建该会话的会话一样,本地临时表,全局临时表(它们以##
开头)会自动删除表结束:但是,因为全局表对于创建它的进程不是私有的,所以它们必须持续存在,直到最后一个在创建会话结束时主动引用该表的Transact-SQL语句完成执行并且锁定被丢弃了。在这些全局临时表存在时有权访问TempDB的任何人都可以直接查询,修改或删除这些临时对象。
您可以将规则,默认值和索引与临时表关联,但不能在临时表上创建视图或将触发器与它们关联。仅当TempDB
中存在数据类型时,才能在创建临时表时使用用户定义的数据类型 CREATE TABLE ##summaryTable (
id int identity(1,1),
)
此Reference更多帮助
答案 1 :(得分:0)
您可以尝试CREATE TABLE #TableName (id int identity(1,1))
这将创建一个临时表。然后将DROP TABLE #TableName
添加到脚本的末尾。
但我不确定你想要的是什么?您正在尝试将文件读入某些内容?
有关临时表的更多信息,请阅读:https://www.simple-talk.com/sql/t-sql-programming/temporary-tables-in-sql-server/和http://www.sqlteam.com/article/temporary-tables。