タグ付けされた質問 「sql-server」

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。

4
トリガーでSELECT * okです。または私はトラブルを求めていますか?
私は仕事で議論に巻き込まれ、見落としている可能性のある落とし穴についてアドバイスが必要です。 削除されたレコードを監査テーブルにコピーするためにトリガーが使用されるシナリオを想像してみてください。トリガーはSELECT *を使用します。誰もが指さして叫び、これがどれほど悪いかを私たちに教えます。 ただし、メインテーブルの構造に変更が加えられ、監査テーブルが見落とされた場合、トリガーによってエラーが生成され、監査テーブルにも変更が必要であることを通知します。 このエラーは、DEVサーバーでのテスト中に検出されます。ただし、プロダクションがDEVと一致することを確認する必要があるため、プロダクションシステムでSELECT *を許可します(トリガーのみ)。 だから私の質問は:私はSELECT *を削除するようにプッシュされていますが、この性質の開発エラー、アイデア、またはこのベストプラクティスを自動的にキャプチャしていることを確認する他の方法がわかりませんか? 以下の例をまとめました: --Create Test Table CREATE TABLE dbo.Test(ID INT IDENTITY(1,1), Person VARCHAR(255)) --Create Test Audit Table CREATE TABLE dbo.TestAudit(AuditID INT IDENTITY(1,1),ID INT, Person VARCHAR(255)) --Create Trigger on Test CREATE TRIGGER [dbo].[trTestDelete] ON [dbo].[Test] AFTER DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; …

2
SQL Server 2016 Standard Editionはテーブルのパーティション分割をサポートしていますか?
SQL Server 2008 Enterprise EditionをSQL Server 2016 Standard Editionにアップグレードしたい。ただし、1つのデータベースは、複数のファイルグループにまたがるテーブルパーティションを使用します(大きなログテーブルで使用され、毎日がパーティションです)。 私はで見るSQL Serverの2016年のためのエディションとサポートされる機能、それはスタンダード版がサポートしていることを言うことは、「RDBMSスケーラビリティとパフォーマンス」の下にテーブルとインデックスのパーティションを、それがないではないサポートするパーティション表の並列処理を。 私がこれの結果を完全に理解しているかどうかはわかりません。 私の場合、それは正確に何を意味し、データベースのパフォーマンスにどのように影響しますか?

1
自動更新統計が統計を更新しない
使用していますSQL SERVER 2012私は私の持っているAuto Update Stats ONを自分のデータベースに。 下記のリンクから、自動更新の統計情報がSQRT(1000 * Table rows)テーブルの行が変更されるたびに発生することがわかりました。 https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/ 1000レコードのテーブルを作成しました SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn, name INTO stst FROM sys.objects 統計の作成 CREATE STATISTICS rn ON stst (rn) CREATE STATISTICS name ON stst (name) 作成した統計の確認 DBCC show_statistics('stst', rn) -- Rows 500 DBCC show_statistics('stst', name) -- …

2
指定された値から別の指定された値までの行を選択します
複数の列を含むテーブルがあり、列の値を確認したいのですが、別の列の値が表示されるまで、その列の値の後の行を選択します。私はを使用してみましたBETWEENが、列の値が整数の場合、整数間の数値のみを検索します。 たとえば、次のようなテーブルがあるとします。 id時間値 t1 12:00 PM 15 t1 12:02 PM 4 t1 12:03 PM 7 t1 12:05 PM 16 t5 12:10 PM 250 t5 12:15 PM 15 t8 11:00 AM 15 t8 3:00 PM 2 t8 3:05 PM 100 t2 7:00 PM 15 t2 7:01 PM 16 t15 5:00 AM …

1
SQL Serverで$ IDENTITYは文書化され、信頼できますか?
SQL Serverが疑似列を使用してテーブルの(単一の)ID列の値を返すことができることを学びました$IDENTITY: SELECT $IDENTITY FROM Table この機能は文書化され、信頼できますか?それについての唯一の公式の言及はIDENTITYページにありますが、コードサンプルに埋め込まれています。これは、文書化されていないことを意図している可能性があることを示唆しています。この機能についても、Googleによる一致はほとんどありません。

1
ヒープテーブルの更新-> RIDのデッドロック
特定のデッドロックシナリオを証明するためにテストケースを設定しており、何が起こっているのかについての洞察が必要です。ヒープテーブルは、HeapTableと呼ばれています。このテーブルは、2つのトランザクションによって同時に更新されます。 トランザクション1: BEGIN TRAN UPDATE HeapTable SET FirstName = 'Dylan' WHERE FirstName = 'Ovidiu'; WAITFOR DELAY '00:00:15'; UPDATE HeapTable SET FirstName = 'Bob' WHERE FirstName = 'Thierry'; ROLLBACK TRANSACTION トランザクション2: BEGIN TRAN UPDATE HeapTable SET FirstName = 'Pierre' WHERE FirstName = 'Michael'; ROLLBACK TRAN 最初にトランザクション1を起動し、その後にトランザクション2を続けます。予想どおり、トランザクション1はいくつかの排他的ロックといくつかの意図的な排他的ロックを要求します。トランザクション2が受信され、同じRIDで更新ロックを要求します。 spid dbid ObjId IndId Type …

1
EXECステートメントのquery_hashがゼロになるのはなぜですか?
私は、拡張イベントを使用してSQL Serverの監視システムをセットアップし、開発者向けの「運用フィードバック」として重いクエリを見つけています。私は、イベントを使用していますsp_statement_completedとsql_statement_completed、CPU_TIME上の述語フィルタを使用して、論理読み取り、など私は上の結果集計するために期待していたdatabase_nameし、query_hashすべてのインターネット上で多数の例で示されたように、結果に、私はそれが見るquery_hashすべての文のために0であります以下の表のように、EXECを使用します(読みやすくするためにタイムスタンプとクエリハッシュを短縮)。 name timestamp query_hash plan_handle statement sql_statement_completed 2016...6414 0 050056019600764... exec Shared.dbo.SyncFirm sql_statement_completed 2016...9946 0 06003d00e01e730... exec spSetUserAuth @userid; sql_statement_completed 2016...7184 0 0600e30028c9da0... exec spSetUserAuth @userid; sp_statement_completed 2016...0409 9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable sp_statement_completed 2016...1448 8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns) EXEC(@sql) sql_statement_completed 2016...7752 0 0600f9006c23f03... exec …

1
SQL Serverデータベースの「デフォルト」テーブル
(SSMSを使用して)開発サーバーに新しいデータベースを追加すると、5つのテーブルが自動的に作成されます。 これらは、別のデータベースにすでに存在するアプリケーションテーブルのコピーです。 これは、テーブルが「共通」などのマークを付けられる場所がわからない最近のSQL Serverの機能であると想定しているため、新しいデータベースに自動的に追加されます。 しかし、どうすればそれを防ぐことができますか? 混乱を避けるため、このデータベースはスクリプト化されておらず、SSMS GUIから直接作成されます([データベース]> [新しいデータベース]を右クリック)。 (StackOverflowから移動)

1
AlwaysONは2014年から2016年に移行します
2014年には約500 DBSの20人のListnerがいます 最小限のダウンタイムと労力でこれらを移行する最良の方法は何ですか 私の考えは次のとおりです。アクセスの停止バックアップdbs復元の開始dbs復元の実行中:2014にAOGをドロップ2016に作成完了 これは簡単に見えますが、TBデータの場合、これにはしばらく時間がかかります。 > -持っているが、この見つかった 2014年から2016年までのAlwaysOn AGをアップグレードするための推奨方法を しかし、それはnietherを説明しません 誰かが助けてくれることを願っています

1
SQLServerのBMKオペレーターとは
私は節からのこの質問に答えようとしていましたが、オプションです。しかし、計画のオペレーターに行き詰まっています。以下は実行計画のスクリーンショットです。 ご覧のとおり、クエリプランにはBMK演算子がありますが、計算方法は示されていません。 手順は、私がこれまで試してみました: 私はBMK1000を探し始めたが、それは同じで質問の束を示しoperator.finally私は1つの見つかったスレッドあなたがしている参照が保たれますヒープ内の保管場所であることを」BMKを語りますクラスターキーの代わりに非クラスター化インデックスを使用します。 "..しかし、これがどのように私と関連しているかはわかりません。インデックスがないためです。 質問: BMK演算子とは何であり、それはどのように計算されます。任意のポインターも役立ちます ここに問題を再現するSQLFiddleがあります

1
SQL Serverは読み取り専用ファイルグループのレコードを更新しましたか?
データウェアハウスに非常に大規模なデータベースがあり、メンテナンスとバックアップを管理するためにパーティションを実装しています。特定の期間のレコードは、最終的には月に1回、読み取り専用ファイルグループに移行されます。 時々、私たちのETLプロセスはすでにアーカイブに移行された古いレコードを更新しようとしますが、これらは失敗すると予想されます。ただし、テスト環境のレコードが読み取り専用ファイルグループのパーティションにあるように見える場合でも、テストのレコードが更新される最近の例が少なくとも2つあります(クエリsys.partition_functionsとsys.partition_range_values)。 本番環境で同一のレコードを使用すると、レコードを更新しようとしたときに予期したエラーが発生します。これまでに2回これをキャッチしましたが、更新は本番環境では失敗しますが、テストでは成功します(その逆はありません)。 関連する環境の事実: SQL Server 2012 SP3 CU3(ビルド11.0.6537.0) テストは開発者版、製品はエンタープライズ版 リクエストに応じて他のユーザーに提供できます:現在深刻な困惑しています... 更新2016-08-19 新しいレコードがどういうわけか一晩で更新されました。読み取り専用ファイルグループ上にあることを確認しました。同時に挿入された(つまり、読み取り専用ファイルグループの同じパーティションにもある)レコードを更新できることがわかりました。同じパーティションで単一のレコードを識別し、そのレコードを複数回更新できました。夜間に更新されたレコードを更新しようとすると、予期した障害が発生します。 更新2016-08-11 更新は、読み取り専用パーティションでのテストの夜間処理中にも発生し続けます。プロセスから同じレコードを更新しようとすると失敗します。以前にそれを更新したユーザーとしてログインしたときに、同じレコードを更新しようとして失敗しました。私はまた、毎晩のプロセスでまだ触れられていない同様のレコードを更新して問題を再現することはできません。 更新2016-08-04 同じパーティションスキームを使用して、別のテーブルで同じ動作の別の発生を発見したため、その単一のテーブルに限定されないことを今日発見しました。 更新2016-08-03 このMSDNスクリプトからスクリプトを実行すると、Kendra Littleのパーティションヘルパービューを使用したときに得られる結果ph.FilegroupDetailとph.ObjectDetail、このデモから確認できます。問題のレコードはパーティション#2にあります(問題のレコードのパーティション列の値は2015-03-18です) Filegroup Low Boundary UpperBoundary Archive (RO) NULL 1900-01-01 Archive (RO) 1900-01-01 2015-04-01 ActiveFG (RW) 2015-04-01 2015-07-01 ActiveFG (RW) 2015-07-01 2015-10-01 ActiveFG (RW) 2015-10-01 2015-01-01 ActiveFG (RW) 2016-01-01 2016-04-01 ActiveFG (RW) …

2
Seek述語のスカラー演算子
SQL Server 2012で実際のクエリを簡略化したバージョンを以下に示します。コンテナテーブルからデータを選択するときに、シーク述語にスカラー演算子があります。 このシーク述語でのスカラー演算子の目的は何ですか? CREATE TABLE #EligibleOrders (OrderID INT PRIMARY KEY, StatusCD CHAR(3), CreatedOnDate DATETIME ) --insert logic into #EligibleOrders --Final Query SELECT T2.OrderID ,olic.LineItemID, SUM(c.quantity) AS ShippedQty, COUNT(DISTINCT c.ContainerID) AS ShippedCases FROM #EligibleOrders T2 INNER JOIN dbo.OrderLineItemContainers (NOLOCK) AS olic ON olic.OrderID = T2.OrderID INNER JOIN dbo.Containers (NOLOCK) AS …

1
AlwaysOn AGを2014年から2016年にアップグレードする推奨方法
Availability Groups1つの同期レプリカでSQL 2014から2016 にアップグレードする場合の推奨プロセスは何ですか? 私の理解では、in-placeアップグレードはデータベースの専門家の間ではあまり好まれていません。でin-placeアップグレードを回避する方法はありますAvailability Groupsか?2016サーバーを既存の2014可用性グループに参加させ、そこでフェイルオーバーしてから、他のインスタンスの1つを「強制終了」してアップグレードする可能性はありますか?(例えば、同じホストでSQLをサイドバイサイドで削除/再インストールすることにより) 他に考慮すべきアップグレードシナリオはありますか? 理想的なソリューションは、常に2つのonlineレプリカがあり、in-placeアップグレードを行う必要がないことです。

2
変更された行ごとにカウンターを増やす
SEQUENCE機能のないSQL Server 2008 Standardを使用しています。 外部システムは、メインデータベースのいくつかの専用テーブルからデータを読み取ります。外部システムはデータのコピーを保持し、データの変更を定期的にチェックして、そのコピーを更新します。 同期を効率的にするために、前回の同期以降に更新または挿入された行のみを転送したいと思います。(行が削除されることはありません)。前回の同期以降に更新または挿入された行を知るために、各テーブルにbigint列RowUpdateCounterがあります。 行が挿入または更新されるたびに、そのRowUpdateCounter列の数が変化するという考え方です。RowUpdateCounter列に入る値は、増え続ける数列から取得する必要があります。RowUpdateCounter列の値は一意である必要があり、テーブルに格納される各新しい値は、以前のどの値よりも大きくなければなりません。 望ましい動作を示すスクリプトをご覧ください。 スキーマ CREATE TABLE [dbo].[Test]( [ID] [int] NOT NULL, [Value] [varchar](50) NOT NULL, [RowUpdateCounter] [bigint] NOT NULL, CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ( [ID] ASC )) GO CREATE UNIQUE NONCLUSTERED INDEX [IX_RowUpdateCounter] ON [dbo].[Test] ( [RowUpdateCounter] ASC ) GO いくつかの行を挿入 INSERT INTO [dbo].[Test] …

4
SQL 2016 SQL Serverアサーション:ファイル:<pageref.cpp>、line = 951失敗したアサーション
現在、データウェアハウスをSQL 2012からSQL 2016にアップグレードしています。新旧両方のDWを並行して実行しています。 私のETLプロセス(サードパーティがSSISで開発したフレームワーク)は2012年に2年以上正常に実行されましたが、2016年には失敗しています。これまでのところ、データベースとETLプロセスは同じです。 どちらのサーバーも、VMWareで実行される仮想マシンです。古いサーバーはWin 2008で、24GbのRAMを搭載しています。SQL 2012標準 最大メモリは16Gbに設定されています。新しいサーバーは64GbのRAMを備えたWin 2012です。SQL 2016開発者。最大メモリは50Gbに設定されています。新しいDWはv13.0.1601.5 RTM Developer Edition(64ビット)を実行しています。 ETLプロセスの実行中に、SQL Mergeを使用してディメンションまたはファクトテーブルにロードするステップは、次のエラーで失敗します。 全文: 説明:SQL Serverアサーション:ファイル:、行= 951失敗したアサーション= 'IS_OFF(BUF_MINLOGGED、m_buf-&gt; bstat)|| pageModifyType!= PageModifyType_Contents || GetPagePtr()-&gt; IsTextPage() '。このエラーはタイミングに関連している可能性があります。ステートメントを再実行してもエラーが解決しない場合は、DBCC CHECKDBを使用してデータベースの構造的な整合性をチェックするか、サーバーを再起動してメモリ内のデータ構造が破損していないことを確認してください。 推奨されるとおり、DBCCを実行しましたが、エラーは見つかりませんでした。SQLも再起動しました。次に、ETLプロセスを再起動したところ、同じエラーが発生しました。 このエラーを検索したところ、SQL 2008、2012、2014の既知のエラーであり、その後の修正プログラムと累積的な更新で修正されたことがわかりました。2016年に再び表示されるのを見て少し驚いています。 私が見つけたリンクは、データベースがシンプルまたは一括ログ復旧モデルである場合に挿入を行おうとすると、SSISに影響を与えると言っています。(私は単純復旧モデルで実行しています) 推奨される回避策は、DB復旧モデルをFULLに変更することです。私はこれを試してみましたがうまくいきましたが、それはデータウェアハウスの解決策ではありません。 2016年に他の誰かがこれに遭遇しましたか? 誰かが代替の回避策を提案できますか? アップデート: 2016年7月26日:重要な更新KB3164398(v13.0.1708.0)を適用しましたが、問題はまだ存在しています。 2016年7月27日:累積的な更新プログラムCU1 KB3164674(v13.0.2149.0)を適用しました。 2016年3月8日:最小のキューブでエラーが一晩発生しました。CU1は問題を修正しませんでした。本日、私はMSコネクトのバグを報告し、マイクロソフトとのサポートコールも記録しました。 2016年12月8日:最初にMS-Supportが応答しましたが、「それに対する修正はありません」という応答でした。サポート担当者は、同僚とそれについて話し合い、私に連絡するつもりでした。8日後、彼から連絡がありません。 「解決策」はありませんが、自分に適した回避策を見つけました。私の投稿した回答をご覧ください。 2016年9月9日。先週CU2を適用しました。Thursayで、同じエラーで再び失敗した古いバージョンのマージを誤って実行しました。CU2はそれを修正していません。 2017 年 1 月23日:2016 SP1 CU1を適用しました。これで問題が解決したと思います。特にKB3205964

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.