Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么不是';是否从存储过程中创建表?_Sql_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 为什么不是';是否从存储过程中创建表?

Sql 为什么不是';是否从存储过程中创建表?,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我正在创建存储过程,需要在其中动态构建一个临时表。我尝试了以下代码,但没有创建表。当我在查询窗口中执行生成的查询时,它在那里工作得很好 --declare query variable DECLARE @Query nvarchar(MAX) SET @Query = 'CREATE TABLE #final (DATE int,' --DECLARE @COLUMNNAME VARIABLE DECLARE @ColName nvarchar(10) OPEN @taCur FE

我正在创建存储过程,需要在其中动态构建一个临时表。我尝试了以下代码,但没有创建表。当我在查询窗口中执行生成的查询时,它在那里工作得很好

--declare query variable
DECLARE @Query nvarchar(MAX)
SET @Query = 'CREATE TABLE #final (DATE int,'   


--DECLARE @COLUMNNAME VARIABLE
DECLARE @ColName nvarchar(10)

OPEN @taCur

FETCH NEXT FROM @taCur INTO @ColName
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @Query = @Query + 'T_' + @ColName +' int,'   
    FETCH NEXT FROM @taCur INTO @ColName
END

SET @Query = @Query + 'TOTAL int,CUMM_TOTAL int)'
print @Query
EXEC sp_executesql @Query
--SET @Query = 'INSERT INTO #final (DATE) VALUES (1)'
SET @Query = 'SELECT * FROM #final'
print @Query
EXEC(@Query)
最终生成的CREATETABLE查询如下

CREATE TABLE #final (DATE int,T_211E int,T_211G int,T_211H int,T_211J int,T_211L int,T_221F int,TOTAL int,CUMM_TOTAL int)

您的问题是临时表只存在于创建它的范围内。。。这在您的第一个
sp_executesql
的范围内。调用
select
语句时,临时表不再在范围内

要解决此问题,您必须构建一个字符串,其中包含对临时表执行的所有操作:在单个
sp_executesql
调用中创建
insert
select
所有操作


但是,您应该知道,如果您不能完全控制用于生成命令的所有值,则当前方法可能容易受到SQL注入的攻击。

您的问题是临时表只存在于创建它的范围内。。。这在您的第一个
sp_executesql
的范围内。调用
select
语句时,临时表不再在范围内

要解决此问题,您必须构建一个字符串,其中包含对临时表执行的所有操作:在单个
sp_executesql
调用中创建
insert
select
所有操作

但是,您应该意识到,如果您不能完全控制用于构建命令的所有值,则当前方法可能容易受到SQL注入的影响。

Object#CREATE和SELECT语句中使用的final不在同一范围内

下面是构造查询的一种方法

  • 尝试用分号终止SQL语句。尽管它不是强制性的,但它将帮助您区分语句的可读性。注意,我在CREATE、INSERT和SELECT语句的末尾包含了分号

  • 您可以注意到,CREATE、INSERT和SELECT是在同一事务中执行的。因此,不会丢失临时表的范围

脚本:

输出:

CREATE和SELECT语句中使用的对象#final不在同一范围内

下面是构造查询的一种方法

  • 尝试用分号终止SQL语句。尽管它不是强制性的,但它将帮助您区分语句的可读性。注意,我在CREATE、INSERT和SELECT语句的末尾包含了分号

  • 您可以注意到,CREATE、INSERT和SELECT是在同一事务中执行的。因此,不会丢失临时表的范围

脚本:

输出:


我应该怎么做才能在范围内得到select语句?我应该怎么做才能在范围内得到select语句?谢谢@Siva…你的答案非常有用谢谢@Siva…你的答案非常有用
    CREATE TABLE dbo.ColumnSchema
    (
        ColName NVARCHAR(10)
    );

    INSERT INTO dbo.ColumnSchema (ColName) VALUES
        ('211E'),
        ('211G'),
        ('211H'),
        ('211J'),
        ('211L'),
        ('211F');


DECLARE @Query      NVARCHAR(MAX);
DECLARE @ColName    NVARCHAR(10);

SET @Query = 'CREATE TABLE #final (DATE int,';

DECLARE taCursor CURSOR FOR 
    SELECT  ColName
    FROM    dbo.ColumnSchema;

OPEN taCursor

FETCH NEXT FROM taCursor 
    INTO @ColName

    WHILE (@@FETCH_STATUS = 0)
    BEGIN

        SET @Query = @Query + 'T_' + @ColName + ' int, '   

        FETCH NEXT FROM taCursor 
            INTO @ColName
    END

CLOSE       taCursor;
DEALLOCATE  taCursor;

SET @Query = @Query + 'TOTAL int,CUMM_TOTAL int); '
SET @Query = @Query + 'INSERT INTO #final (DATE) VALUES (1); '
SET @Query = @Query + 'SELECT * FROM #final; '

EXEC (@Query);
DATE T_211E T_211G T_211H T_211J T_211L T_211F TOTAL CUMM_TOTAL
---- ------ ------ ------ ------ ------ ------ ----- ----------
1    NULL   NULL   NULL   NULL   NULL   NULL   NULL  NULL