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

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

2
特定の特殊文字のISNUMERICの背後にあるロジックは何ですか?
このISNUMERIC関数には予期しない動作があります。MSDNドキュメントには次のように書かれています。 ISNUMERIC入力式が有効な数値データ型に評価されると1を返します。有効な数値データ型には、int、bigint、smallint、tinyint、decimal、numeric、money、smallmoney、float、realが含まれます。 また、脚注もあります。 ISNUMERICプラス(+)、マイナス(-)などの数字ではない一部の文字、およびドル記号($)などの有効な通貨記号に対して1を返します。通貨記号の完全なリストについては、「money and smallmoney(Transact-SQL)」を参照してください。 わかりましたので+、-、と記載されている通貨記号は、数値と見なされることが期待されます。ここまでは順調ですね。 奇妙な部分です。まず、リンクされた記事の通貨記号の一部は数値ではありません。 ユーロ通貨記号、16進数20A0: ₠ ナイラサイン、ヘックス20A6: ₦ リアルサイン、16進FDFC: ﷼ これは奇妙で、なぜなのかわかりませんか?このバージョンまたは環境に依存していますか? しかし、物事は奇妙になります。私が説明できない他のいくつかはここにあります: /数値ではありませんが、\です(ハァッ!!) REPLICATE(N'9', 308)数値ですが、そうでREPLICATE(N'9', 309)はありません 最初の最も基本的な質問は、上記のケースを説明するものは何ですか?さらに重要なことですが、背後ISNUMERICにあるロジックは何ですか?したがって、すべてのケースを自分で説明/予測できますか? 物を再現する良い方法は次のとおりです。 DECLARE @tbl TABLE(txt NVARCHAR(1000)); INSERT INTO @tbl (txt) VALUES (N''), (N' '), (N'€'), (N'$'), (N'$$'), (NCHAR(8356)), (NCHAR(8352)), (NCHAR(8358)), (NCHAR(65020)), (N'+'), (N'-'), (N'/'), (N'\'), (N'_'), (N'e'), (N'1e'), (N'e1'), (N'1e1'), …

2
複数の列を選択し、1つだけグループ化する方法は?
に問題がgroup byあります。複数の列を選択しますが、1つの列のみでグループ化します。以下のクエリは私が試したものですが、エラーが発生しました。 SELECT Rls.RoleName,Pro.[FirstName],Pro.[LastName],Count(UR.[RoleId]) as [Count] from [b.website-sitecore-core].[dbo].[aspnet_UsersInRoles] UR inner join [b.website-professional-au].[dbo].[Profile] Pro on UR.UserId = Pro.Id inner join [b.website-sitecore-core].[dbo].[aspnet_Roles] Rls on Rls.RoleId = UR.RoleId inner join [b.website-professional-au].[dbo].[Gender] Gn on gn.Id = pro.GenderId GROUP BY Rls.RoleName;

1
ロールdb_ownerで許可されること
SQL Server 2012データベースの特定のテーブルを表示できないログインのトラブルシューティングを試みました。そうすることで、私はそのdb_owner役割のメンバーシップが許可するものをよく理解していないことがわかります。などの他の役割を理解db_datareader and db_datawriterすることdb_ownerはできますが、何が許可されるかについては混乱したままです。

1
SQL Server 2012で仮想アカウントではなく管理されたサービスアカウントを使用する理由は何ですか?
SQL Server 2012のでは、サービスアカウントは、次のように作成された仮想口座説明するように、(VAS)ここでは対照的に、管理されたサービスアカウント(MSAは)。 説明に基づいて、これらについて見られる重要な違い: MSAはドメインアカウント、VAはローカルアカウントです MSAはADによって処理される自動マジックパスワード管理を使用し、VAにはパスワードがありません Kerberosコンテキストでは、MSAはSPNを自動的に登録しますが、VAは 他に違いはありますか?Kerberosが使用されていない場合、DBAがMSAを好むのはなぜですか? 更新:別のユーザーは、VAに関するMSドキュメントの矛盾の可能性に気付きました: 仮想アカウントは自動管理されており、仮想アカウントはドメイン環境のネットワークにアクセスできます。 対 仮想アカウントは、リモートロケーションに対して認証できません。すべての仮想アカウントは、マシンアカウントの権限を使用します。次の形式でマシンアカウントをプロビジョニングします <domain_name>\<computer_name>$。 「マシンアカウント」とは何ですか?どのように/いつ/なぜ「プロビジョニング」されますか?「ドメイン環境でネットワークにアクセスする」と「(ドメイン環境で)リモートロケーションに認証する」の違いは何ですか?

1
NULL可能複合インデックスで範囲シークを再結合しますか?
次のスキーマとサンプルデータの場合 CREATE TABLE T ( A INT NULL, B INT NOT NULL IDENTITY, C CHAR(8000) NULL, UNIQUE CLUSTERED (A, B) ) INSERT INTO T (A) SELECT NULLIF(( ( ROW_NUMBER() OVER (ORDER BY @@SPID) - 1 ) / 1003 ), 0) FROM master..spt_values アプリケーションは、このテーブルの行をクラスター化インデックスの順序で1,000行のチャンクで処理しています。 最初の1,000行は、次のクエリから取得されます。 SELECT TOP 1000 * FROM T …
14 sql-server  index 

1
nvarchar列のサイズを変更する場合、一意のインデックスを削除する必要がありますか?また、インデックスの再作成時にテーブルがロックされますか?
私たちのデータベースには、次のような多かれ少なかれ大きなテーブルがあります。 CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); しかし、今ではシリアルフィールドのサイズが小さくなっているので、32に変更したいと思います。VisualStudioスキーマ比較ツールは、これを行うことを提案します。 DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); これは本当に必要ですか?それとも、これを行う超保存的な方法のようなものですか? また、一意のインデックスを再作成すると、テーブルがロックされますか?これは大きな問題になるためです(テーブルには3,000万行あり、インデックスの再作成にはかなり時間がかかると思います)。これは、次のメンテナンスウィンドウが数か月先になるためです。私の選択肢は何ですか?

1
避けるべきではありませんか?
一部のSQL Server開発者の間でNOT INは、非常に遅いと広く信じられている信念であり、クエリは、同じ結果を返すが「悪」キーワードを使用しないように書き換える必要があります。(例)。 それに真実はありますか? 例えば、使用してクエリの原因となるSQL Serverのいくつかの既知のバグ(バージョンは?)ありますNOT IN使用している同等のクエリよりも悪い実行計画を持っています LEFT JOIN組み合わせNULL小切手または (SELECT COUNT(*) ...) = 0中WHERE節?

1
AlwaysOn AG、フェールオーバー付きDTC
問題: AlwaysOn可用性グループ(AG)のすべてのサーバーで分散トランザクションコーディネーター(DTC)を実行するにはどうすればよいですか?フェールオーバー/スイッチオーバーイベントでトランザクションを維持する必要はありません。 セットアップ: Windows 2012フェールオーバークラスター(WSFC)に3台のWindows 2008 R2サーバーがあり、すべてSQL 2012を実行しています。2つのサーバーが1つのデータセンターにあり、AlwaysOnフェールオーバークラスター(FCI)の一部であり、 2番目のデータセンター。WSFCはマルチサブネットクラスターです。セットアップのスケッチは次のとおりです。 2つのFCIノードは同じサブネット上にあり、ストレージを共有しているため、2つのFCIノード間で動作するようにDTCをインストールおよび構成できました。いくつかのAGを構成しましたが、正常に機能しています。このスクリーンショットは、FCIにインストールされたDTCを示しています。 このスクリーンショットは、FCIノードのいずれか(アクティブな方)でDTCを構成できることを示しています。 DTCを使用するアプリケーションをこのクラスターに移行し、AGを使用したいと思います。私は、DTCがAGでサポートされていないことを読みました(参照)。2番目のデータセンターの3番目のノードでDTCを構成する方法を見つけることができませんでした。3番目のノードでDTCを構成しようとすると、次のスクリーンショットに示すように、DTCを使用できないようです。 Brent Ozarの無料セットアップチェックリストPDFに、可用性グループのリストがあります。 クラスターのインストール... 29. FCIが関係する場合は、計画セクションの決定に従ってDTCを構成します。 SQL Server 2012のAlwaysOn可用性グループに関するコメントで、Rock Brent氏は次のように述べています。「... ..」 これにより、AGスイッチオーバーでトランザクションが維持されないことを理解している限り、可用性グループでDTCを使用できるように見えます。FCIノードからのトランザクションを維持するためには必要ありません。壊滅的な災害(プライマリデータセンターを失った)の場合に使用するアプリケーションにDTCが必要なだけです。 3番目のノードでDTCを構成するにはどうすればよいですか?または、AGとDTCを必要とするアプリケーションの使用に関して、私は運が悪いのですか? 更新:私が解決した解決策は、ログ配布を使用することです。ただし、フェールオーバーの場合、Node3でDTCを使用できるようにする必要があります。Node1とNode2の間で共有されているDTCのクラスター化されたMSDTC-MSSQLSERVERCLUインスタンスをアンインストールすることで利用可能になることを発見しました。削除したら、Node3でLocalDTCインスタンスをセットアップおよび構成できます。その後、クラスター化されたMSDTC-MSSQLSERVERCLUインスタンスを再インストールできます。この順序でインストールシーケンスを実行すると動作するようです。私は今少しの間そのように走っています、そして私はどんな悪影響も発見していません。これは、AlwaysOn可用性グループを実行する場合にも機能するようです。AGフェールオーバーでは分散トランザクションが保持されないことを理解しています。フェールオーバー後に動作するには新しいトランザクションのみが必要です。しかし、私は持っていません

2
DBCC CHECKDBの修復不可能な破損:インデックス付きビューには、ビュー定義によって生成されなかった行が含まれています
TL; DR:インデックス付きビューに修正不可能な破損があります。詳細は次のとおりです。 ランニング DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS 私のデータベースのいずれかで次のエラーが生成されます: メッセージ8907、レベル16、状態1、行1空間インデックス、XMLインデックス、またはインデックス付きビュー 'ViewName'(オブジェクトID 784109934)には、ビュー定義によって生成されなかった行が含まれています。これは、必ずしもこのデータベース内のデータの整合性の問題を表しているわけではありません。(...) CHECKDBは、テーブル 'ViewName'で0個の割り当てエラーと1個の一貫性エラーを検出しました。 repair_rebuildは最小修復レベル(...)です。 このメッセージは、インデックス付きビュー「ViewName」の具体化されたデータが、基になるクエリが生成するものと同一ではないことを示していることを理解しています。ただし、データを手動で検証しても矛盾は発生しません。 SELECT * FROM ViewName WITH (NOEXPAND) EXCEPT SELECT ... from T1 WITH (FORCESCAN) join T2 on ... SELECT ... from T1 WITH (FORCESCAN) join T2 on ... EXCEPT SELECT * FROM ViewName …

1
前の行までの合計
ウィンドウ関数に関するヘルプが必要です。ウィンドウ内の合計とウィンドウ内の現在の合計を計算できることを知っています。しかし、前の現在の合計、つまり現在の行を含まない現在の合計を計算することはできますか? ROWまたはRANGE引数を使用する必要があると思います。私はCURRENT ROWオプションがあることを知っていますが、私CURRENT ROW - 1は無効な構文である必要があります。ROWとのRANGE議論に関する私の知識は限られているので、どんな助けもありがたいことに受けます。 私は、この問題に対する多くのソリューションがあることを知っているが、私は理解しているよROW、RANGE引数を、私はこの問題は、これらにひび割れすることが可能と仮定します。以前の実行中の合計を計算する1つの可能な方法を含めましたが、もっと良い方法があるのではないかと思います。 USE AdventureWorks2012 SELECT s.SalesOrderID , s.SalesOrderDetailID , s.OrderQty , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal -- Sudo code - I know this does not work --, SUM(s.OrderQty) OVER (PARTITION …

1
SOS_SCHEDULER_YIELD待機のトラブルシューティング
企業のERP(Dynamics AX 2012)を実行すると、実稼働環境が開発システムよりもはるかに遅いように見えました。 開発環境と実稼働環境の両方で同じアクティビティを実行し、トレースを実行した後、開発環境と比較して実稼働環境でのSQLクエリの実行が非常に遅いことを確認しました(平均で10〜50倍遅い)。 最初はこれをロードに起因すると考え、営業時間外に本番環境で同じアクティビティを再実行し、トレースで同じ結果を見つけました。 SQL Serverで待機統計をクリアし、しばらくの間、サーバーを通常の運用負荷で実行させた後、次のクエリを実行しました。 WITH [Waits] AS (SELECT [wait_type], [wait_time_ms] / 1000.0 AS [WaitS], ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], [signal_wait_time_ms] / 1000.0 AS [SignalS], [waiting_tasks_count] AS [WaitCount], 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage], ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] FROM sys.dm_os_wait_stats …

4
結合は実行時にwhere節に最適化されていますか?
このようなクエリを作成すると... select * from table1 t1 join table2 t2 on t1.id = t2.id SQLオプティマイザーは、それが正しい用語であるかどうかはわかりませんが、それを... select * from table1 t1, table2 t2 where t1.id = t2.id 基本的に、SQL ServerのJoinステートメントはsqlを書くための簡単な方法ですか?それとも、実際に実行時に使用されますか? 編集:私はほとんど常に、そしてほとんど常にJoin構文を使用します。私は何が起こるのか興味があります。


1
31億行のデータを管理する方法は?
私は現在、比較的大量のデータ用のストレージスキーマの実装を担当しています。データは主に現在のdata point値を判断するためにアクセスされますが、データの傾向分析のために過去6か月の履歴を追跡する必要もあります。 最近の要件は、過去1時間のmin/ max/ sum値を追跡するために追加されました。 注:理想的には、MongoDBオプションを検討したいと思いますが、最初にSQL-Serverオプションを使い果たしたことを示す必要があります。 データ 次の表は、プライマリデータソース(最も頻繁にクエリされる)を表しています。テーブルには約500万行が含まれます。データの変更は主に、初期データのロード後のUPDATE非常に不定期のINSERTステートメントを伴うステートメントになります。dataPointIdあなたがいつも選択するので、私はデータをクラスタリングすることを選びましたall values for a given data point。 // Simplified Table CREATE TABLE [dbo].[DataPointValue]( [dataPointId] [int] NOT NULL, [valueId] [int] NOT NULL, [timestamp] [datetime] NOT NULL, [minimum] [decimal](18, 0) NOT NULL, [hourMinimum] [decimal](18, 0) NOT NULL, [current] [decimal](18, 0) NOT NULL, [currentTrend] [decimal](18, 0) …

5
「巨大な」データベーステーブルPKのシーケンシャルGUIDまたはbigint
この種の質問がたくさん出てくることは知っていますが、この決定を下すのに役立つ説得力のある議論をまだ読んでいません。我慢してください! 私には巨大なデータベースがあります-それは1日あたり約10,000,000レコード増加します。データはリレーショナルであり、パフォーマンス上の理由から、BULK COPYでテーブルをロードします。このため、行のキーを生成する必要があり、IDENTITY列に依存することはできません。 64ビット整数(bigint)は使用するのに十分な幅がありますが、一意性を保証するには、IDを作成するための集中ジェネレーターが必要です。私は現在、サービスがXシーケンス番号を予約し、衝突がないことを保証するようなジェネレーターサービスを持っています。ただし、この結果は、私が持っているすべてのサービスがこの1つの集中ジェネレーターに依存しているため、システムの配布方法が制限され、他の依存関係(ネットワークアクセスの要求など)に満足できませんこの設計によって。これはときどき問題になりました。 プライマリGUID(SQLの外部で生成される)としてシーケンシャルGUIDを使用することを検討しています。私自身のテストで確認できた限り、これらの唯一の欠点は、より広いデータ型のディスク領域のオーバーヘッドです(インデックスでの使用により悪化します)。bigintの選択肢と比較して、クエリのパフォーマンスが目に見えるほど遅くなることはありません。BULK COPYを使用したテーブルのロードはわずかに遅くなりますが、それほどではありません。GUIDベースのインデックスは、シーケンシャルGUID実装のおかげで断片化されていません。 基本的に、私が知りたいことは、私が見落としているかもしれない他の考慮事項があるかどうかです。現時点では、私は飛躍してGUIDを使い始めたいと思っています。私は決してデータベースの専門家ではないので、どんなガイダンスでも大歓迎です。

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