5

非常に複雑なテーブルがあり、いくつかの変更を行っている間、一時的にバックアップを取りたいと考えています。通常、私は次のことを行うだけです。

SELECT  *
INTO    temp_User
FROM    dbo.[User] AS u

残念ながら、私は Azure を使用していますが、これはサポートされていないようです:

メッセージ 40510、レベル 16、状態 1、行 2 ステートメント 'SELECT INTO' は、このバージョンの SQL Server ではサポートされていません。

この機能を関数に再作成する方法はありますか? テーブルをスクリプト化し、テーブルを作成し、select ステートメントを使用してデータを挿入することでこれを行うことができますが、Azure を使用する頻度と、この領域で作業する必要があるデータベースの数を考えると、これは非常に扱いにくいものです。

4

6 に答える 6

5

新しいAzure DB Update プレビューでは、この問題が解決されています。

V12 プレビューでは、クラスター化インデックスを持たないテーブルを作成できます。この機能は、クエリ結果からテーブルを作成する T-SQL SELECT...INTO ステートメントのサポートに特に役立ちます。

http://azure.microsoft.com/en-us/documentation/articles/sql-database-preview-whats-new/

于 2015-01-13T22:14:30.947 に答える
1

残念ながらそれはできません。これが私がそれを回避した方法です:

  1. SQL Server Management Studio を開く
  2. テーブルを右クリック
  3. スクリプトを次のように選択...テーブルを作成
  4. 生成されたスクリプトを編集して、テーブル名をクエリで指定したものに変更します
  5. クエリを実行します
于 2014-03-31T02:41:09.650 に答える
0

Id、Column1、および Column2 を持つテーブルがあるとします。次に、これがあなたの解決策になる可能性があります

CREATE TABLE YourTableName_TMP ....
GO
SET IDENTITY_INSERT YourTableName_TMP ON 
GO
INSERT INTO YourTableName_TMP
([Id] ,[Column1] ,[Column2])      
SELECT [Id] ,[Column1] ,[Column2]
FROM 
(
    SELECT * 
    FROM
    (
        SELECT  [Id] ,[Column1] ,[Column2] ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNum
        FROM YourTableName
    )
    WHERE RowNum BETWEEN 0 AND 500000
)
GO
SET IDENTITY_INSERT YourTableName_TMP OFF
GO

最初に一時テーブルを作成し、次にウィンドウ化された行を挿入します。それは混乱です、私は知っています。私の経験では、クライアントから SQL Server Management Studio を使用してこれを実行すると、1 分間に約 200.000 行が作成されます。

于 2015-01-31T23:03:11.313 に答える
0

上記のように、 select intoを使用してクエリを書き直して、次のようなテーブルを作成する必要があります

私の見本です。だった :

        select  emrID, displayName --select into
        into #tTable
        from emrs

        declare @emrid int
        declare @counter int = 1
        declare @displayName nvarchar(max)

        while exists (select * from #tTable)
        begin
            -- some business logic
            select top 1  @displayName = displayname
            from #tTable
            group by displayname
            update emrs  set groupId = @counter where @displayName = displayname    
            delete #tTable
            where @displayName = displayname
            set @counter = @counter + 1 
        end
        drop table #tTable

変更:

        CREATE TABLE #tTable ([displayName] nvarchar(max)) --create table
        INSERT INTO #tTable -- insert to next select  :

        select  displayName            
        from emrs

        declare @emrid int
        declare @counter int = 1
        declare @displayName nvarchar(max)

        while exists (select * from #tTable)
        begin
            -- some business logic
            select top 1  @displayName = t.displayName
            from #tTable as t
            group by t.displayname
            update emrs  set groupId = @counter where @displayName = displayname    
            delete #tTable
            where @displayName = displayname
            set @counter = @counter + 1 
        end
        drop table #tTable

一時テーブルを削除することを忘れないでください。また、説明付きのより簡単な例をここで見つけることができます: http://www.dnnsoftware.com/wiki/statement-select-into-is-not-supported-in-this-version-of-sql-server

于 2016-01-19T12:46:45.673 に答える