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

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


6
グループごとにn行を取得する
結果セットの各グループから多くの行を選択する必要がよくあります。 たとえば、顧客ごとに最近の注文値の最高または最低を「n」個リストしたい場合があります。 より複雑な場合、リストする行の数はグループごとに異なる場合があります(グループ化/親レコードの属性によって定義されます)。この部分は間違いなくオプション/追加のクレジットのためであり、人々が答えることを思いとどまらせることを意図していません。 SQL Server 2005以降でこれらのタイプの問題を解決するための主なオプションは何ですか?各方法の主な長所と短所は何ですか? AdventureWorksの例(わかりやすくするため、オプション) TransactionHistoryMからRまでの文字で始まる製品ごとに、テーブルから最新の5つのトランザクション日付とIDをリストします。 繰り返しますが、n製品ごとに履歴行がnあり、DaysToManufacture製品属性の5倍です。 同様に、製品ごとに正確に1行の履歴行が必要な特別な場合(TransactionDate、タイブレークでの最新の単一エントリ)TransactionID。

1
ターゲット表のサブセットをマージします
MERGEステートメントを使用してテーブルの行を挿入または削除しようとしていますが、それらの行のサブセットのみを操作したいです。のドキュメントにMERGEは、かなり強い言葉で警告があります: マッチングの目的で使用されるターゲットテーブルの列のみを指定することが重要です。つまり、ソース表の対応する列と比較されるターゲット表の列を指定します。AND NOT target_table.column_x = valueを指定するなど、ON句でターゲットテーブルの行をフィルタリングしてクエリのパフォーマンスを向上させないでください。これを行うと、予期しない誤った結果が返される場合があります。 しかし、これはまさにMERGE仕事をするために私がしなければならないように見えるものです。 私が持っているデータは、次のようなアイテムとカテゴリ(たとえば、どのアイテムがどのカテゴリに含まれているか)の標準的な多対多の結合テーブルです。 CategoryId ItemId ========== ====== 1 1 1 2 1 3 2 1 2 3 3 5 3 6 4 5 私がする必要があるのは、特定のカテゴリのすべての行を新しいアイテムのリストで効果的に置き換えることです。これを行う最初の試みは次のようになります。 MERGE INTO CategoryItem AS TARGET USING ( SELECT ItemId FROM SomeExternalDataSource WHERE CategoryId = 2 ) AS SOURCE ON SOURCE.ItemId = ...

6
ウィンドウ関数を使用した日付範囲のローリングサム
日付範囲でローリングサムを計算する必要があります。説明するために、AdventureWorksサンプルデータベースを使用して、次の仮想構文で必要なことを正確に実行できます。 SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = SUM(TH.ActualCost) OVER ( PARTITION BY TH.ProductID ORDER BY TH.TransactionDate RANGE BETWEEN INTERVAL 45 DAY PRECEDING AND CURRENT ROW) FROM Production.TransactionHistory AS TH ORDER BY TH.ProductID, TH.TransactionDate, TH.ReferenceOrderID; 悲しいことに、RANGEウィンドウフレーム範囲は現在SQL Serverで間隔を許可していません。 サブクエリと通常の(非ウィンドウ)集計を使用してソリューションを作成できることを知っています。 SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = ( SELECT SUM(TH2.ActualCost) FROM Production.TransactionHistory AS TH2 ...

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_¯\_(ツ)_/¯] ...

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 CASEステートメントはすべての条件を評価するか、最初のTRUE条件で終了しますか?
SQL Server(具体的には2008または2012)CASEステートメントはすべてのWHEN条件WHENを評価しますか、またはtrueと評価される句を見つけると終了しますか?条件のセット全体を通過する場合、真と評価された最後の条件が真と評価された最初の条件が上書きしたことを意味しますか?例えば: SELECT CASE WHEN 1+1 = 2 THEN'YES' WHEN 1+1 = 3 THEN 'NO' WHEN 1+1 = 2 THEN 'NO' END 最後のwhen条件により「NO」と評価されるはずですが、結果は「YES」です。最初のTRUE条件が見つかると終了するようです。誰かがこれが事実であるかどうか確認してください。
44 sql-server  t-sql  case 

9
トランザクションを使用せず、回避策を使用して1つをシミュレートするように要求
私は数年間T-SQLを開発してきましたが、常に掘り下げて、言語のすべての側面についてできる限りのことを学び続けています。私は最近新しい会社で働き始め、取引に関して奇妙な提案だと思うものを受け取りました。それらを使用しないでください。代わりに、トランザクションをシミュレートする回避策を使用してください。これは、1つのデータベースで多くのトランザクションを処理し、その後多くのブロッキングを行うDBAによるものです。私が主に作業しているデータベースはこの問題の影響を受けず、トランザクションは過去に使用されたことがあります。 トランザクションはブロックすることが本来の性質であるため、トランザクションでブロックすることが期待されていることを理解しています。しかし、各ステートメントが正常に実行されなければならない場合が多くあります。1つが失敗した場合、それらはすべてコミットに失敗する必要があります。 私は常にトランザクションの範囲をできる限り狭く保ち、常にSET XACT_ABORT ONと組み合わせて使用​​し、常にTRY / CATCH内で使用しています。 例: CREATE SCHEMA someschema; GO CREATE TABLE someschema.tableA (id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, ColA VARCHAR(10) NOT NULL ); GO CREATE TABLE someschema.tableB (id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, ColB VARCHAR(10) NOT NULL ); GO CREATE PROCEDURE someschema.ProcedureName @ColA ...

8
選択結果をcsvファイルに書き込む
SELECTクエリの結果をcsvファイルに書き込む必要があります。SQL Server 2008 r2でT-SQLを使用してどのように実行できますか?SSISで実行できることは知っていますが、何らかの理由でこのオプションはありません。 以下の記事で推奨されるprocを使用しようとしましたが、procを実行すると、このprocで呼び出されるsys.sp_OACreateおよびsys.sp_OADestroyを実行できないというSQLのエラーが発生します。 これらのコンポーネントを有効にする方法を知っていますか、T-SQLを使用してファイルに書き込むより良い方法を知っていますか? 前もって感謝します。

1
すべてのT-SQLステートメントの後
各SQLステートメントの後にGOステートメントを使用する理由は何ですか?GOはバッチの終了を通知し、ステートメントの評判を許可しますが、ステートメントごとにそれを使用する利点は何ですか。 声明のたびに多くのマイクロソフトのドキュメントなどが使用を開始したか、気づき始めたばかりかもしれません。 また、ベストプラクティスと見なされるものは何ですか?

3
カウントで実行中の合計?
タイトルが示唆しているように、T-SQLで積算合計を取得するためにいくつかの助けが必要です。問題は、私がする必要がある合計がカウントの合計であることです: sum(count (distinct (customers))) カウントを単独で実行した場合、結果は次のようになります。 Day | CountCustomers ---------------------- 5/1 | 1 5/2 | 0 5/3 | 5 私は合計で出力する必要があります: Day | RunningTotalCustomers ---------------------- 5/1 | 1 5/2 | 1 5/3 | 6 coalesceメソッドを使用する前に合計を実行しましたが、カウントは実行しませんでした。私はカウントを持っているので、今それを行う方法がわかりません。
34 sql-server  t-sql 

3
ストアドプロシージャの出力パラメーターとしてのテーブル値パラメーター
ストアドプロシージャの出力パラメーターとして使用されるTable-Valuedパラメーターは可能ですか? ここに、私がコードでやりたいこと /*First I create MY type */ CREATE TYPE typ_test AS TABLE ( id int not null ,name varchar(50) not null ,value varchar(50) not null PRIMARY KEY (id) ) GO --Now I want to create stored procedu whic is going to send output type I created, --But it looks ...

7
SQL Serverデータベースがまだ使用されているかどうかを確認するにはどうすればよいですか?
いくつかのデータベースがまだ残っているSQL Serverインスタンスの使用停止を検討しています。 それらがまだユーザーまたはWebアプリケーションによって使用されているかどうかを確認するにはどうすればよいですか? 最終クエリの日付を取得するために実行できるT-SQLクエリを含むフォーラムスレッドを見つけました。動作しているようですが、この情報がデータベースを削除するのに十分かどうかを知りたいです。それは...ですか? 同様に役立つ代替方法がある場合。
33 sql-server  t-sql 

5
条件の論理演算子OR ANDおよびWHEREの条件の順序
これらの2つのステートメントを調べてみましょう。 IF (CONDITION 1) OR (CONDITION 2) ... IF (CONDITION 3) AND (CONDITION 4) ... 場合はCONDITION 1、IS TRUE、だろうCONDITION 2チェックしますか? 場合はCONDITION 3、IS FALSE、だろうCONDITION 4チェックしますか? 条件についてはどうですかWHERE:SQL ServerエンジンはWHERE句内のすべての条件を最適化しますか?SQL Serverオプティマイザーが条件を正しい方法で解決するために、プログラマは条件を正しい順序で配置する必要がありますか? 追加: リンクを提供してくれたジャックに感謝します。t-sqlコードからの驚きです。 IF 1/0 = 1 OR 1 = 1 SELECT 'True' AS result ELSE SELECT 'False' AS result IF 1/0 = 1 AND ...

1
ステートメントの実行速度がネットワーク接続に依存するのはなぜですか?
T-SQLの実行速度は、サーバーに対するネットワーク接続の待機時間に依存しているようです。SQL Serverがクライアントにレポートするものがない場合、実行されるまで実行されますが、テストでは別の話が示されます。 create procedure UselessLoop @I int as declare @D datetime = getdate() while @I > 0 set @I -= 1 print datediff(millisecond, @D, getdate()) exec UselessLoop 100000 Server Milliseconds local 53 nearby 63 faraway 660 exec UselessLoop 1000000 Server Milliseconds local 546 nearby 640 faraway 6183 テストは、SSMSを使用して異なるコンピューターから同じサーバーに対して実行されます。ローカルはサーバーから実行され、近くは同じローカルネットワーク上にあり、遠くは1ギガビットファイバーで接続された500 km離れた別のオフィスから実行されます。 実行されるステートメントの数に直接依存する、SQL ...
31 sql-server  t-sql 

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