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

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

6
リテラル値のみを使用するWHERE句でISNULL()を置き換える別の方法は何ですか?
これが何でないか: これは、ユーザー入力を受け入れるか、変数を使用するキャッチオールクエリに関する質問ではありません。 これは、厳密に述語と比較するために値をカナリア値に置き換える句でISNULL()使用されるクエリと、それらのクエリをSQL Server でSARGableに書き換えるさまざまな方法に関するものです。WHERENULL 向こうに席がありませんか? このクエリ例は、SQL Server 2016のStack Overflowデータベースのローカルコピーに対するもので、NULL年齢または18歳未満のユーザーを探します。 SELECT COUNT(*) FROM dbo.Users AS u WHERE ISNULL(u.Age, 17) < 18; クエリプランは、非常に思慮深い非クラスター化インデックスのスキャンを示しています。 スキャン演算子は、SQL Serverの最新バージョンの実際の実行計画XMLへの追加のおかげで、すべてのスティンキン行を読み取ったことを示します。 全体として、9157の読み取りを行い、約0.5秒のCPU時間を使用します。 Table 'Users'. Scan count 1, logical reads 9157, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads …
55 sql-server 

2
Unicodeパラメーターと変数名を作成する方法
このすべての機能: CREATE DATABASE [¯\_(ツ)_/¯]; GO USE [¯\_(ツ)_/¯]; GO CREATE SCHEMA [¯\_(ツ)_/¯]; GO CREATE TABLE [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]([¯\_(ツ)_/¯] NVARCHAR(20)); GO CREATE UNIQUE CLUSTERED INDEX [¯\_(ツ)_/¯] ON [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]([¯\_(ツ)_/¯]); GO INSERT INTO [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]([¯\_(ツ)_/¯]) VALUES (N'[¯\_(ツ)_/¯]'); GO CREATE VIEW [¯\_(ツ)_/¯].[vw_¯\_(ツ)_/¯] AS SELECT [¯\_(ツ)_/¯] FROM [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]; GO CREATE PROC [¯\_(ツ)_/¯].[sp_¯\_(ツ)_/¯] @Shrug NVARCHAR(20) AS SELECT [¯\_(ツ)_/¯] FROM [¯\_(ツ)_/¯].[vw_¯\_(ツ)_/¯] …

11
配列パラメーターをストアドプロシージャに渡す
大量のレコード(1000枚)を取得してそれらを処理するプロセスがあり、完了したら、大量のレコードを処理済みとしてマークする必要があります。IDの大きなリストでこれを示すことができます。「ループ内の更新」パターンを回避しようとしているので、このIDのバッグをMS SQL Server 2008ストアドプロシージャに送信するより効率的な方法を見つけたいと思います。 提案#1-テーブル値パラメーター。IDフィールドだけでテーブルタイプを定義し、更新するIDでいっぱいのテーブルを送信できます。 提案#2-proc本体のOPENXML()を使用したXMLパラメーター(varchar)。 提案#3-リストの解析。扱いにくく、エラーが発生しやすいと思われるため、可能であれば、これを避けたいと思います。 これらの中に好みがありますか、それとも私が見逃したアイデアはありますか?

2
テーブル値関数でテーブルを結合する方法は?
ユーザー定義関数があります: create function ut_FooFunc(@fooID bigint, @anotherParam tinyint) returns @tbl Table (Field1 int, Field2 varchar(100)) as begin -- blah blah end 次のように、これを別のテーブルに参加させたいと思います。 select f.ID, f.Desc, u.Field1, u.Field2 from Foo f join ut_FooFunc(f.ID, 1) u -- doesn't work where f.SomeCriterion = 1 言い換えると、1であるすべてのFooレコードについて、の入力に対してから返されるおよびの値とともに、およびSomeCriterionを表示する必要があります。Foo IDDescField1Field2ut_FooFuncFoo.ID これを行うための構文は何ですか?

1
ハロウィーンの保護を超えた機能をスケジュールすることには何か利点がありますか
SCHEMABINDING関数が更新計画で不要なスプールを回避できることはよく知られています。 テーブルに触れない(つまり、データにアクセスしない)単純なT-SQL UDFを使用している場合SCHEMABINDING、UDFの作成中にオプションを指定してください。これにより、UDFがスキーマバインドされ、クエリオプティマイザーがこれらのUDFに関連するクエリプランに対して不要なスプール演算子を生成しないようにします。 SCHEMABINDINGデータにアクセスしない場合でも、関数には他の利点がありますか?

3
ワイルドカード(またはトップ)の追加に関するSQL Serverクエリの大幅な減速
SQL Server 2005データベースで追跡する2,000万匹の動物園があります。それらの約1%は黒で、約1%は白鳥です。私はすべての黒い白鳥の詳細を取得したかったので、私がやった結果ページを埋めたくありませんでした。 select top 10 * from animal where colour like 'black' and species like 'swan' (はい、これらのフィールドはフリーテキストですが、両方ともインデックス付けされています)。クエリが約300ミリ秒で空のセットを返すため、このような動物はいません。「いいね」ではなく「=」を使用した場合、約2倍の速さでしたが、入力の手間を省くという予感があります。 頭の飼育係は彼が白鳥のいくつかを「黒っぽい」と入力したかもしれないと思うので、それに応じてクエリを修正します: select top 10 * from animal where colour like 'black%' and species like 'swan' どちらもありません(実際、「黒」以外の「黒%」動物はありません)が、クエリが空になるまでに約30秒かかります。 それは、「top」と「like%」の組み合わせだけが問題を引き起こしているようです select count(*) from animal where colour like 'black%' and species like 'swan' すぐに0を返し、さらに select * …

7
ORDER BYがビューに属さないのはなぜですか?
私はあなたが視野に入れないことを理解し ています 。(少なくとも私が作業しているSQL Server 2012では) ORDER BY また、ビューを並べ替える「正しい」方法は、ビューを照会するステートメントをORDER BY囲むSELECTことです。 しかし、実用的なSQLとビューの使用法が比較的新しいので、なぜこれが設計によって行われるのかを理解したいと思います。履歴を正しく追跡していれば、これはかつて可能であり、SQL Server 2008などから明示的に削除されました(正確なバージョンについては引用しないでください)。 ただし、Microsoftがこの機能を削除した理由について私が思い付くことができる最も良い理由は、「ビューはデータの並べ替えられていないコレクション」だからです。 ビューをソートしない理由に関して、論理的で適切な理由があると思います。ビューが単なるフラット化されたデータのコレクションになれないのはなぜですか?なぜ特別に未ソートなのですか?ソートされたビューを持つことは完全に直感的であると思われる状況(少なくとも私にとって/ IMHO)を思い付くのはそれほど難しくないようです。


4
2008 R2よりもSQL Server 2012を好む客観的なビジネス上の理由は何ですか?
私の会社は、新しいデータベースサーバー用にSQL Server 2012 DenaliとSQL Server 2008 R2のどちらを購入するかの決定に直面しています。客観的な理由を探して、どちらかを選択します。 私たちの要件: Standardエディション(経済的理由およびエンタープライズ機能の必要性の欠如のため) OLTPワークロード(つまり、新しいウィンドウ関数と列ストアインデックスは不要です) 10〜100 GBのデータベースサイズ ビジネスインテリジェンス機能は必要ありません。リレーショナルエンジンのみが必要です 同期データベースミラーリング 現在、次の理由がわかっています。 SQL Server 2012デナリ 利用可能な最新バージョン SQL Server 2008 R2 実績のある技術 どちらか一方を好むという技術的な理由はあまりないようです。基本的に、成功している実績のあるテクノロジーと、利用可能な最新かつ最高のバージョンを選択することになります。 決定を下す客観的な理由は何ですか?

4
ストアドプロシージャの結果を保持できるSQL Serverで一時テーブルを作成する最も簡単な方法は何ですか?
多くの場合、SQL Serverを扱うときは次のようなものを書く必要があります。 create table #table_name ( column1 int, column2 varchar(200) ... ) insert into #table_name execute some_stored_procedure; ただし、ストアドプロシージャの結果は退屈なタスクであるため、正確な構文を持つテーブルを作成します。たとえば、sp_helppublicationの結果には48列あります!これを行う簡単な方法があるかどうかを知りたいです。 ありがとう。

5
SQL Serverオプション「アドホックワークロード用に最適化」を使用しないのはなぜですか?
このようなKimberly TrippによるSQL Serverプランのキャッシュに関するいくつかの素晴らしい記事を読んでいます:http : //www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/ 「アドホックワークロード向けに最適化する」オプションさえあるのはなぜですか?これは常にオンにすべきではありませんか?開発者がアドホックSQLを使用しているかどうかに関係なく、それをサポートするすべてのインスタンス(SQL 2008+)でこのオプションを有効にしないのはなぜですか?


3
COALESCEとISNULLのパフォーマンスの違いは?
多くの人がISNULLの代わりにCOALESCE関数を使用するのを見てきました。インターネット検索から、COALESCEはANSI標準であることがわかったので、COALESCEを使用するときに何を期待するかを知っているという利点があります。ただし、ISNULLの方がわかりやすいため、ISNULLの方が読みやすいようです。 ISNULLは、データベースサーバーや言語によって動作が異なるため、ややこしいこともわかります。 私の考えでは、そのすべてがスタイルと標準に要約されています。スタイルが主観的であることを考えると、ISNULLではなくCOALESCEを使用する(またはその逆)理由はありますか?具体的には、一方のパフォーマンスが他方より優れていますか?

7
SQL Serverでdatetime2に日付と時刻を組み合わせる方法は?
次のコンポーネントを考える DECLARE @D DATE = '2013-10-13' DECLARE @T TIME(7) = '23:59:59.9999999' それらを組み合わせてDATETIME2(7)価値のある結果を生成する最良の方法は何'2013-10-13 23:59:59.9999999'ですか? 動作しないものを以下にリストします。 SELECT @D + @T オペランドデータ型の日付は、追加演算子には無効です。 SELECT CAST(@D AS DATETIME2(7)) + @T オペランドのデータ型datetime2は、add演算子には無効です。 SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D) datediff関数の結果、オーバーフローが発生しました。2つの日付/時刻インスタンスを分離する日付部分の数が多すぎます。精度の低い日付部分でdatediffを使用してみてください。 *を使用して、Azure SQL DatabaseおよびSQL Server 2016でオーバーフローを回避できますDATEDIFF_BIG。 SELECT CAST(@D AS DATETIME) + @T 日付と時刻のデータ型は、add演算子と互換性がありません。 SELECT CAST(@D AS DATETIME) + CAST(@T AS …

12
主キー/外部キーの一致が結合に使用されないのはなぜですか?
多くのDBMS(mysql、postgres、mssqlなど)を見つけることができる限り、fkとpkの組み合わせはデータへの変更を制限するためだけに使用されますが、それらはネイティブで結合する列を自動的に選択するために使用されることはほとんどありません(名前での自然な結合のように)。何故ですか?pk / fkを使用して2つのテーブル間のリレーションシップを既に定義している場合、データベースでそれらのテーブルを結合するとpk / fk列で結合したいことがわかりません。 編集:これを少し明確にするために: table1とtable2があるとします。table1の列aには外部キーがあり、これはtable2の主キーbを参照します。これらのテーブルを結合する場合、次のようにする必要があります。 SELECT * FROM table1 JOIN table2 ON table1.a = table2.b ただし、table1.aがtable2.bを参照するキーを使用してすでに定義しているので、DBMSシステムがtable1.aとtable2.bを結合列として自動的に使用することを難しくするべきではないようです。次のように単純に使用できます: SELECT * FROM table1 AUTO JOIN table2 ただし、多くのDBMSはこのようなものを実装していないようです。
48 mysql  sql-server 

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