声明稍后将在sql server程序中使用的动态表?

时间:2015-10-15 16:03:35

标签: sql-server stored-procedures

我正在研究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)

任何帮助都会受到赞赏吗?

2 个答案:

答案 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