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

Transact-SQL(T-SQL)は、Microsoft SQL ServerおよびSAPのSybaseで使用されるSQLの方言です。

2
メインクエリのエイリアスと同じサブクエリのエイリアス
エイリアスがそのサブクエリのエイリアスのいくつかと同じであるSQLクエリがあります。 例えば: select * from ROOM r where ... ( select * from ROAD r where ... ) サブクエリのエイリアスはメインのエイリアスを隠すように見えるため、これはうまく機能します。 それはすべての場合にそのように機能しますか? 未定義の結果を取得することはありますか? それが問題ない場合、メインクエリの参照を作成するにはどうすればよいrですか?

4
結果を最初の2つのランキング行に制限する
SQL Server 2008では、を使用RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)してデータセットを返すために使用していRANKます。ただし、各パーティションには数百のレコードがあるため、ランク1、2、3 ...... 999から値を取得します。しかし、私RANKsはそれぞれ2つまでしかしたくないPARTITION。 例: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 History 7 Joe 80 Geography 8 Tim 100 Geography …

6
SQL Serverインジェクション-26文字でどれくらいのダメージがありますか?
SQL Serverデータベースへのインジェクション攻撃に対する回復力をテストしています。 dbのすべてのテーブル名は小文字であり、照合は大文字と小文字を区別するLatin1_General_CS_ASです。 送信できる文字列は大文字に強制され、最大26文字の長さにすることができます。したがって、テーブル名が大文字になり、照合のためにステートメントが失敗するため、DROP TABLEを送信できません。 だから-私は26文字でできる最大のダメージは何ですか? 編集 パラメーター化されたクエリなどについてはすべて知っています。送信するクエリを作成するフロントエンドを開発した人が、この場合はparamsを使用しなかったとします。 また、私は悪意のあることをしようとはしていません。これは、同じ組織内の他の誰かによって構築されたシステムです。

1
すべてのトリガーにSET NOCOUNT ONを追加する必要がありますか?
あなたが持っているべきかなり一般的な知識です SET NOCOUNT ON デフォルトでは、新しいストアドプロシージャを作成します。 Microsoftはこれを2012年に含めるようにデフォルトのテンプレートを変更しました。これはトリガーでも同じであると考えましたが、テンプレートには含まれていません。 これは意図的ですか、それとも単なる見落としですか?

2
すべてのレコードを選択し、結合が存在する場合はテーブルAと結合し、存在しない場合はテーブルBと結合します
だからここに私のシナリオがあります: 私は私のプロジェクトのローカリゼーションに取り組んでおり、通常はC#コードでこれを行いますが、SQLを少し強化しようとしているので、SQLでこれをもう少しやりたいと思っています。 環境:SQL Server 2014 Standard、C#(.NET 4.5.1) 注:プログラミング言語自体は無関係である必要があります。完全を期すためだけに含めています。 それで、私は自分が望むものをやや達成しましたが、私が望んでいた程度ではありませんでした。JOIN基本的なもの以外のSQLを実行してからしばらく(少なくとも1年)経ちましたが、これは非常に複雑JOINです。 データベースの関連テーブルの図を次に示します。(他にもたくさんありますが、この部分には必要ありません。) 画像に記述されているすべての関係はデータベースで完全です- PKとFK制約はすべて設定および操作されています。説明されている列はどれもnullできません。すべてのテーブルにはスキーマがありますdbo。 今、私はほとんど私がしたいことをするクエリを持っています:つまり、ANY Id of SupportCategoriesとANY Id of が与えられるとLanguages、それは次のいずれかを返します: その文字列のためにその言語の右適切な翻訳がある場合(IeはStringKeyId- > StringKeys.Id存在し、中LanguageStringTranslations StringKeyId、LanguageIdとStringTranslationIdの組み合わせが存在し、それはロードStringTranslations.TextそのためStringTranslationId。 場合はLanguageStringTranslations StringKeyId、LanguageIdとStringTranslationIdの組み合わせがなかったしない存在し、それはロードStringKeys.Name値を。Languages.Id与えられていますinteger。 私のクエリは、それが混乱であっても、次のとおりです。 SELECT CASE WHEN T.x IS NOT NULL THEN T.x ELSE (SELECT CASE WHEN dbo.StringTranslations.Text IS NULL THEN dbo.StringKeys.Name ELSE dbo.StringTranslations.Text END AS Result FROM …

4
HashBytes関数で適切なアルゴリズムを選択する
比較のために、nvarcharデータのハッシュ値を作成する必要があります。T-SQLには複数のハッシュアルゴリズムがありますが、このシナリオで選択するのに最適なものはどれですか? 2つの異なるnvarchar値のハッシュ値が重複するリスクが最小になるようにします。インターネットでの私の研究に基づいて、MD5が最高のようです。そうですか?MSDNは、利用可能なアルゴリズムについて(下記のリンク)を教えてくれますが、どの条件のどのアルゴリズムに関する説明はありませんか? HASHBYTES(Transact-SQL) 2つのテーブルを2つのnvarchar(max)列で結合する必要があります。ご想像のとおり、クエリの実行には時間がかかります。各nvarchar(max)データのハッシュ値を保持し、ブロブであるnvarchar(max)値ではなく、ハッシュ値で結合を行う方が良いと考えました。問題は、どのハッシュアルゴリズムが一意性を提供するかです。そのため、1つ以上のnvarchar(max)に対して1つのハッシュ値を持つリスクに直面することはありません。

3
選択で一致する余分な文字を含む一意の識別子
一意の識別子を使用してSQL Server 2012を使用していますが、末尾に追加文字(36文字ではない)を追加して選択すると、UUIDとの一致が返されることに気付きました。 例えば: select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 行をuuidで返します7DA26ECB-D599-4469-91D4-F9136EC0B4E8。 しかし、あなたが実行した場合: select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS' また、uuidを持つ行を返します7DA26ECB-D599-4469-91D4-F9136EC0B4E8。 SQL Serverは、選択を行うときに36を超えるすべての文字を無視するようです。これはバグ/機能または構成可能なものですか? フロントエンドで長さの検証を行っているため、大きな問題ではありませんが、私には正しい動作とは思えません。


5
CTE結果をキャッシュ(遅延スプール)するためのプランガイドを作成する
私は通常、最初に正しいプランを使用するクエリを作成し、それを使用しない同様のクエリにコピーすることにより、プランガイドを作成します。ただし、特にクエリが完全に同じではない場合は、注意が必要です。ゼロから計画ガイドを作成する正しい方法は何ですか? SQLKiwiはSSISで計画を作成することについて言及しましたが、SQL Serverの適切な計画のレイアウトを支援する方法または有用なツールはありますか? 問題の特定のインスタンスは、このCTEです:SQLFiddle with cte(guid,other) as ( select newid(),1 union all select newid(),2 union all select newid(),3) select a.guid, a.other, b.guid guidb, b.other otherb from cte a cross join cte b order by a.other, b.other; そこにあるいかなる結果が正確に3つの異なる思い付くようにする方法guidsおよびこれ以上は?いくつかのSQL Server CTEの癖を克服するために複数回参照されるCTEタイプのクエリを含むプランガイドを含めることで、今後より良い質問に答えられることを望んでいます。
19 sql-server  t-sql  cte 

2
テーブル行の「CO2」を「CO₂」に更新できません
この表が与えられた場合: CREATE TABLE test ( id INT NOT NULL, description NVARCHAR(100) COLLATE Modern_Spanish_CI_AS NOT NULL ); INSERT INTO test (id, description) VALUES (1, 'CO2'); 活版印刷の問題を解決できないことに気付きました。 SELECT * FROM test WHERE id = 1; UPDATE test SET description = 'CO₂' WHERE id = 1; SELECT * FROM test WHERE id = …

2
「SELECT TOP」パフォーマンスの質問
selectを使用するtop 100とはるかに高速に実行され、select を使用しないとはるかに低速になるクエリがありますtop 100。返されるレコードの数は0です。クエリプランの違いについて説明したり、そのような違いが説明されているリンクを共有したりできますか。 topテキストなしのクエリ: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 上記のクエリプラン(なしtop): https://pastebin.com/cbtJpxFf IOおよびTIME統計(なしtop): SQL Server parse and compile time: CPU time = …

4
想像できるようにT-SQLで変数を使用できないのはなぜですか?
許してください、私はSQLの世界に移行した開発者です。変数を追加することでSQLを改善できると思いましたが、期待どおりに機能しませんでした。誰かがこれがうまくいかない理由を教えてもらえますか?私は回避したくない、これがうまくいかない理由を知りたいのですが、正当な理由があると確信しているので、私はそれがうまくいくと思いますが、現在それは飛び出していません。 DECLARE @DatabaseName varchar(150) SET @DatabaseName = 'MyAmazingDatabaseName' CREATE DATABASE @DatabaseName GO USE @DatabaseName GO

2
数百万行にわたるカスタマイズ可能な並べ替えによるページングパフォーマンス
このアプリケーションには、ユーザーが多数のレコード(1000万から2000万)をページングできるグリッドがあります。グリッドは、多数の列(20以上)での昇順と降順の並べ替えをサポートしています。値の多くも一意ではないため、アプリケーションはidブレイクとしてidでソートして、行が常に同じページに表示されるようにします。例として、ユーザーがウィジェットサイズ(最大から開始)でソートする場合、アプリケーションは次のようなクエリを生成します。 SELECT TOP 30 * -- (Pretend that there is a list of columns here) FROM Test -- WHERE widgetSize > 100 ORDER BY widgetSize DESC, id ASC このクエリは(キャッシュデータを使用して)実行に約15秒かかります。主なコストは、widgetSizeで約130万行をソートすることです。このクエリを調整しようとしてWHERE、最大のWidgetSizesに制限された句を追加すると(上記のクエリでコメントアウトされている)、クエリはわずか〜800msかかることを発見しました(上位50,000の結果はすべてウィジェットサイズ> 100です) 。 WHERE句のないクエリが非常に遅いのはなぜですか?widgetSize列の統計情報を確認したところ、上位739行のWidgetSize> 506が示されています。30行しか必要ないため、SQLサーバーはこの情報を使用してウィジェットサイズの行のみを並べ替える必要があることを推測できませんどっちが大きい? 私はこのことができますことを知っている特定の上のインデックスに追加することにより、迅速に実行したクエリwidgetSizeとはid、しかし、このインデックスは、この特定のシナリオでのみ有用であり、(例えば)ユーザがソート方向を反転させる場合は無価値になります。このテーブルには多くの追加の列が含まれており、各インデックスは大きいため(〜200 MB)、すべての可能な並べ替え順序にインデックスを追加する余裕はありません。 すべての可能な並べ替え順序にインデックスを追加せずにこれらのクエリクエリを実行する方法はありますか?(ユーザーは20以上の列のいずれかでソートできます) 次のスクリプトは、上記のテーブルを作成し、代表的なデータを入力します。テーブルは実際のテーブルよりもはるかに狭いですが、私が見ているパフォーマンスを示しています。私のPCでは、where句のあるクエリは200ミリ秒かかりますが、where caluseのないクエリは800ミリ秒かかります。 警告:このスクリプトの実行後の結果のデータベースのサイズは最大2Gbです。 CREATE TABLE Test ( id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, …

2
デフォルトの制約、それだけの価値はありますか?
私は通常、次のルールに従ってデータベースを設計します。 db_ownerとsysadmin以外は誰もデータベーステーブルにアクセスできません。 ユーザーの役割はアプリケーション層で制御されます。通常、1つのdbロールを使用して、ビュー、ストアドプロシージャ、および関数へのアクセスを許可しますが、場合によっては、一部のストアドプロシージャを保護するための2番目のルールを追加します。 TRIGGERSを使用して、重要な情報を最初に検証します。 CREATE TRIGGER <TriggerName> ON <MyTable> [BEFORE | AFTER] INSERT AS IF EXISTS (SELECT 1 FROM inserted WHERE Field1 <> <some_initial_value> OR Field2 <> <other_initial_value>) BEGIN UPDATE MyTable SET Field1 = <some_initial_value>, Field2 = <other_initial_value> ... END DMLは、ストアドプロシージャを使用して実行されます。 sp_MyTable_Insert(@Field1, @Field2, @Field3, ...); sp_MyTable_Delete(@Key1, @Key2, ...); sp_MyTable_Update(@Key1, @Key2, …

2
WITH CHECK CHECK CONSTRAINTとは何ですか?
おそらく自動生成されたT-SQLがいくつかありますが、これはおそらく有効ですが、実際にはわかりません。 ALTER TABLE [dbo].[MyTable] WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; 私は外部キー制約が何であるか知っていますが、何CHECK CHECKですか?

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