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

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

5
日時文字列に1ミリ秒を追加する方法は?
選択に基づいて、次のようにx行を返すことができます。 1 2019-07-23 10:14:04.000 1 2019-07-23 10:14:11.000 2 2019-07-23 10:45:32.000 1 2019-07-23 10:45:33.000 ミリ秒はすべて0です。 1ミリ秒ごとに1を追加する方法があるので、選択は次のようになります。 1 2019-07-23 10:14:04.001 1 2019-07-23 10:14:11.002 2 2019-07-23 10:45:32.003 1 2019-07-23 10:45:33.004 カーソルを作成しようとしていますが、成功していません。 これは、必要な結果を取得するためのクエリです。 select top 10 ModifiedOn from [SCHEMA].[dbo].[TABLE] where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59' 81kの値があります。フィールドはDATETIMEです。

3
SQLサーバーは挿入時にXML構造を変更します
SQLサーバーのXML列にXMLデータを挿入していますが、データが挿入された後、SQLサーバーによって変更されています。ここに私が挿入するデータがあります <xsl:value-of select="name/n/given" /> <xsl:text> </xsl:text> <xsl:value-of select="name/n/family" /> 読み返すとこんな感じ <xsl:value-of select="name/n/given" /> <xsl:text /> <xsl:value-of select="name/n/family" /> 2行目に注意してください。XSLT変換の出力方法が変わるため、これは問題です。最初の例では、名と姓の間にスペースが作成されますが、2番目の例ではスペースが作成されないため、JohnJohnsenのようになり、最初の例ではJohn Johnsenのようになります。 これを解決する方法はありますか?
15 sql-server  xml 

1
SARGable述語をCTEまたは派生テーブルにプッシュできるのはいつですか?
土嚢 最高品質のPosts®をブログに取り組んでいる間、私は私が実際に見つかったいくつかのオプティマイザの動作に出くわした腹立たしい興味深いです。私はすぐには説明がありませんが、少なくとも私が満足している説明はありませんので、誰かがスマートになった場合に備えてここに説明します。 追跡する場合は、2013バージョンのStack Overflowデータダンプをこちらから入手できます。コメントテーブルを使用していますが、インデックスが1つ追加されています。 CREATE INDEX [ix_ennui] ON [dbo].[Comments] ( [UserId], [Score] DESC ); クエリ1 このようにテーブルをクエリすると、奇妙なクエリプランが表示されます。 WITH x AS ( SELECT TOP 101 c.UserId, c.Text, c.Score FROM dbo.Comments AS c ORDER BY c.Score DESC ) SELECT * FROM x WHERE x.Score >= 500; ScoreのSARGable述部はCTE内にプッシュされません。計画のかなり後の時点でフィルター演算子に含まれています。 これORDER BYは、フィルターと同じ列にあるため、おかしいと思います。 クエリ2 クエリを変更すると、プッシュされます。 WITH x …


2
500データベースのSQL Server 2017-CU9以降頻繁にAGが切断する
みなさん、こんにちは。あなたの助けに感謝します。SQL Server 2017可用性グループで課題が発生しています。 バックグラウンド 会社は小売B2Bバックエンドソフトウェアです。約500の単一テナントデータベース、およびすべてのテナントで使用される5つの共有データベース。ワークロードの特性は主に読み取られ、データベースの大部分のアクティビティは非常に低くなっています。 コロケーションでホストされている物理的な運用サーバーは、共有SAN / FCI構成のWindows Server 2012上のSQL Server 2014 Enterpriseから、2ソケット/ 32コア/ 768 GB RAMおよびローカルのWindows Server 2016上のSQL Server 2017 Enterpriseに最近アップグレードされましたAlwaysOn AGを使用したSSDドライブ。AGトラフィックは、クロスケーブル接続で専用の10G NICポートを使用します。 それらの要件は、すべてのデータベースが一緒にフェールオーバーすることであるため、すべてを単一のAGに配置する必要がありました。これは、同一サーバー上の単一の読み取り不可能な同期レプリカです。 新しいサーバーは、2018年6月から運用されています。最新のCU(当時のCU7)とWindowsの更新プログラムがインストールされ、システムは正常に機能していました。約1か月後、サーバーをCU7からCU9に更新した後、サーバーは優先度の高い順に以下の課題に気付き始めました。 SQL Sentryを使用してサーバーを監視しており、物理的なボトルネックは観察されていません。すべての重要な指標は良いようです。CPUは平均20%、IO時間は通常1ミリ秒未満、RAMは完全に使用されておらず、ネットワークは1%未満です。 課題 フェールオーバー後に症状は良くなるようですが、どちらのサーバーがプライマリであるかに関係なく、数日以内に戻ってきます。症状は両方のサーバーで同じです。 次のような散発的なクライアントタイムアウトと接続障害 ...接続の確立中にエラーが発生しました... または 実行タイムアウトが切れました 場合によっては、これらは最大40秒間続き、その後沈静化します。 トランザクションログバックアップジョブの完了には、以前よりも10倍時間がかかります。以前は、500個すべてのデータベースのログをバックアップするのに2〜3分かかりましたが、現在では15〜25分かかります。バックアップ自体が良好なスループットで正常に実行されることを確認しました。ただし、1つのログのバックアップが完了してから次のログを開始するまでにわずかな遅延があります。非常に低い値から始まりますが、1〜2日で2〜3秒かかります。500個のデータベースを乗算すると、違いがあります。 時々、ランダムに見える一部のデータベースが、手動フェールオーバー後に「同期していない」状態のままになります。これを解決する唯一の方法は、セカンダリレプリカでSQL Serverサービスを再起動するか、これらのデータベースを削除してAGに再結合することです。 CU10で導入された別の問題(CU11では解決されていません):master.sys.databasesでのブロッキングのセカンダリタイムアウトへの接続、およびセカンダリレプリカにSSMSオブジェクトエクスプローラーを使用することさえできません。根本的な原因は、Microsoft SQL Server VSSライターが次のクエリを発行してブロックしているようです。 select name, recovery_model_desc, state_desc, CONVERT(integer, is_in_standby), ISNULL(source_database_id,0) from …

5
未使用領域を再利用しようとすると、SQL Serverで使用領域が大幅に増加します
実稼働データベースに525 GBのサイズのテーブルがあり、そのうち383 GBは未使用です。 このスペースの一部を回収したいのですが、実稼働DBをいじる前に、より少ないデータでテストDBの同一のテーブルでいくつかの戦略をテストしています。この表には同様の問題があります。 テーブルに関するいくつかの情報: フィルファクターは0に設定されます 約30列あります 列の1つはイメージタイプのLOBであり、数KBから数百MBのサイズのファイルを格納しています テーブルには仮想インデックスが関連付けられていません サーバーは、SQL Server 2017(RTM-GDR)(KB4505224)-14.0.2027.2(X64)を実行しています。データベースはSIMPLE復旧モデルを使用しています。 私が試したいくつかのこと: インデックスの再構築:ALTER INDEX ALL ON dbo.MyTable REBUILD。これによる影響はごくわずかです。 インデックスの再編成:ALTER INDEX ALL ON dbo.MyTable REORGANIZE WITH(LOB_COMPACTION = ON)。これによる影響はごくわずかです。 LOB列を別のテーブルにコピーし、列をドロップし、列を再作成し、データをコピーしました(この記事で概説したように、未使用スペースのSQL Serverテーブルの解放)。これにより、未使用のスペースが減少しましたが、使用済みのスペースに変換するだけのようです。 bcpユーティリティを使用して、テーブルをエクスポート、切り捨て、再読み込みします(この投稿で説明されているように、テーブルの未使用スペースを解放する方法)。これにより、未使用スペースが削減され、使用済みスペースが上のイメージと同程度に増加しました。 推奨されていませんが、DBCC SHRINKFILEおよびDBCC SHRINKDATABASEコマンドを試してみましたが、これらは未使用の領域に影響を与えませんでした。 実行DBCC CLEANTABLE('myDB', 'dbo.myTable')しても違いはありませんでした 画像とテキストのデータ型を維持しながら、データ型をvarbinary(max)とvarchar(max)に変更した後、上記のすべてを試しました。 新しいデータベースの新しいテーブルにデータをインポートしようとしましたが、これも未使用スペースを使用済みスペースに変換するだけでした。この投稿でこの試みの詳細を概説しました。 これらが期待できる結果である場合、実稼働DBでこれらの試行を行いたくないので、 これらの試行のいくつかの後、未使用スペースが使用済みスペースに変換されるのはなぜですか?私は内部で何が起こっているのかよく理解していないように感じます。 使用済みスペースを増やすことなく、未使用スペースを減らすためにできることは他にありますか? 編集:テーブルのディスク使用量レポートとスクリプトは次のとおりです。 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON …

3
SQL Server:現在のセッションでのみ更新のトリガーを無効にする方法は?
SQL Server 2008 R2に取り組んでいます。 tiu_benefitという名前のAFTER INSERT、UPDATEトリガーを持つテーブルの利点があります。 このテーブルのUPDATEステートメントを記述して1行を更新したいのですが、トリガーを起動したくありません。UPDATEの前にトリガーを無効にしてから、UPDATEの後にトリガーを有効にできることを知っています。 DISABLE TRIGGER tiu_benefit ON benefit; GO UPDATE benefit SET editor = 'srh' where benefit_id = 9876 GO ENABLE TRIGGER tiu_benefit ON benefit; GO ただし、この無効化および有効化のトリガーは、現在ログインしているすべてのユーザーに影響します。そのため、トリガーによってスクリプトが無効になっている間に別のユーザーがUPDATE / INSERTを実行する可能性がありますが、これは適切ではありません。そのため、現在のセッションのトリガーのみを無効および有効にします。出来ますか?はいの場合、その方法を教えてください。 ありがとう

2
read_onlyファイルグループの列ストアインデックスによりCheckDBが妨げられる
ファイルグループに列ストアインデックスが含まれている場合、データベース全体をread_only防止するようdbcc checkdbにファイルグループを設定しているようです。実行しようとするcheckdbかcheckfilegroup(のための任意の読み書きセカンダリとを含め、データベース内のファイルグループ[PRIMARY])、以下のエラーが返されます... Msg 8921, Level 16, State 1, Line 24 Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors. 読み取り専用のファイルグループに列ストアデータを保持するためのサポートされている方法はありますか?または、このシナリオの整合性チェックから除外されますか? 再現 create database check_fg_ro go use check_fg_ro go exec sp_changedbowner 'sa'; go alter database check_fg_ro add …

2
まだロックを保持しているクエリを見つける方法は?
sys.dm_tran_locksDMVを照会すると、テーブル、ページ、行などのリソースでロックを保持しているセッション(SPID)がわかります。 取得したロックごとに、どのSQLステートメント(削除、挿入、更新、または選択)がそのロックを引き起こしたかを判別する方法はありますか? DMV のmost_recent_query_handle列にはsys.dm_exec_connections最後に実行されたクエリのテキストが表示されますが、他のクエリは同じセッション(SPID)で実行され、ロックを保持していることが何度かあります。 私はすでにsp_whoisactive(Adam Machanicの)プロシージャを使用していますが、現時点では入力バッファー上にあるクエリのみを表示しています(考えてみてくださいDBCC INPUTBUFFER @spid)。 例えば: オープントランザクション/セッション ステートメントの実行(リソースのロックを保持) 同じセッションで別のステートメントを実行する 別のトランザクション/セッションを開き、ステップ2でロックされたリソースの変更を試みます。 このsp_whoisactive手順では、ステップ3でステートメントを指摘しますが、これはロックの原因ではないため、役に立ちません。 この質問は、ブロックされたプロセスレポート機能を使用して分析を実行し、本番環境でのブロックシナリオの根本原因を見つけることから生まれました。各トランザクションは複数のクエリを実行しますが、ほとんどの場合、最後のクエリ(BPRの入力バッファに表示される)がロックを保持するクエリになることはほとんどありません。 フォローアップの質問があります:ブロッキングクエリを効果的に識別するフレームワーク

1
サブクエリ内のCOALESCEがNULLを返すのはなぜですか?
このスキーマを考えます: CREATE TABLE #TEST_COALESCE ( Id int NOT NULL, DateTest datetime NOT NULL, PRIMARY KEY (Id, DateTest) ); INSERT INTO #TEST_COALESCE VALUES (1, '20170201'), (1, '20170202'), (1, '20170203'), (2, '20170204'), (2, '20170205'), (2, '20170206'); サブクエリ内でCOALESCEを使用すると、NULLが返されます。 SELECT t1.Id, t1.DateTest, (SELECT TOP 1 COALESCE(t2.DateTest, t1.DateTest) FROM #TEST_COALESCE t2 WHERE t2.Id = t1.Id …
15 sql-server 

6
大量のデータの行間の違いの詳細を照会する
300を超える列を持つ大きなテーブルがいくつかあります。私が使用しているアプリケーションは、セカンダリテーブルに現在の行のコピーを作成して、変更された行の「アーカイブ」を作成します。 些細な例を考えてみましょう: CREATE TABLE dbo.bigtable ( UpdateDate datetime, PK varchar(12) PRIMARY KEY, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); アーカイブ表: CREATE TABLE dbo.bigtable_archive ( UpdateDate datetime, PK varchar(12) NOT NULL, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); で更新が実行される前dbo.bigtableに、行のコピーが作成されますdbo.bigtable_archive、次にdbo.bigtable.UpdateDate現在の日付で更新されます。 したがってUNION、2つのテーブルをまとめてグループ化するとPK、変更のタイムラインが作成されます。UpdateDateます。 次の形式で、並べUpdateDate替え、グループ化、行間の違いを詳細に説明するレポートを作成しPKます。 …

3
最も近い値を見つけるためにSQL Serverでクエリを作成する方法
私はテーブルに次の整数値があるとしましょう 32 11 15 123 55 54 23 43 44 44 56 23 OK、リストは続行できます。関係ありません。ここで、このテーブルにクエリを実行し、特定の数のを返しclosest recordsます。numer 32に最も近いレコードを10個返したいとしましょう。これを効率的に達成できますか? SQL Server 2014にあります。

2
非ASCII文字を確認する方法
VARCHARフィールドに非ASCII文字が含まれているかどうかを確認する最良の方法は何ですか? CHAR(1)スルーCHAR(31)とCHAR(127)スルーCHAR(255)。 使用PATINDEXしてみましたが、次の問題に遭遇しました。 低い範囲のチェックは正常に機能しました。 SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0 私のデータには0x1Eのレコードが3つあり、3つすべてが返されました。 しかし、上の範囲だけをチェックすると: SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 テーブル内のすべてのレコード(テーブルカウント170737および返されたカウント170735)に近い値を返します。この範囲の値がデータにないため、レコードが返されなかったはずです。

2
サブクエリを使用してSQLを削除する方法
次のコードは、テーブルから重複するレコードを削除するために開発者の1人によって追加されました。 DELETE SubQuery FROM ( SELECT ID ,FK1 ,FK2 ,CreatedDateTime ,ROW_NUMBER() OVER(PARTITION BY FK1, FK2 ORDER BY CreatedDateTime) AS RowNumber FROM Table ) AS SubQuery WHERE RowNumber > 1 コードをレビューするとき、私はそれが機能しないと仮定しましたが、テスト環境(SQL 2014)でテストするとそれが機能することがわかります! SQLはサブクエリを解決し、レコードを削除する方法をどのように知っていますかtable?

1
複数のインデックスが欠落している実行計画
「実際の実行プランを含める」でクエリを実行すると、プランは欠落しているインデックスも提案します。インデックスの詳細はMissingIndexes、XML 内のタグです。計画に複数のインデックスの提案が含まれている状況はありますか?さまざまなSQLクエリを試しましたが、2つ以上の欠落インデックスを生成するクエリを思い付くことができませんでした。

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