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

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

1
Transact-SQLの集計関数の後に等号(=)を配置できますか?
私はこのようなスクリプトに遭遇しました: set @sum = sum = (case when somecol1 is null then DATEDIFF(d,[somecol2],somecol3) else 0 end) 2番目のキーワードの合計の後の等号(=)の意味が理解できません。クエリを実行すると、等号がある場合とない場合の両方でエラーが表示されません。 キーワードの後に​​等号を付ける目的を知りたいsum。それは間違いですか? ありがとう

1
N'Șc 'は、Latin1_General_CI_AS照合を使用してN'C'の重複キーを検討しました
NVARCHAR(50)列を含む一意のキーを持つテーブルがあります(正しいかどうかはわかりますが、あります)。そのため、挿入しようとすると、ȘcまたはC(挿入の順序は関係ありません)、照合の問題により2番目の挿入で中断します。ここにエラーがあります: (1行が影響を受けました)メッセージ2601、レベル14、状態1、行16一意のインデックス 'IX_TestT'を持つオブジェクト 'dbo.testT'に重複するキー行を挿入できません。重複するキーの値は(C)です。 返品を選択: データベースのデフォルトの照合はLatin1_General_CI_ASです。既存の構造をあまり変更せずに、その解決方法をしばらく探しましたが、機能する方法を見つけることができませんでした。さまざまな照合順序と組み合わせを試しましたが、すべて失敗します。まだ展開されていないキャラクターの展開などについて(こことここ)を読んでください。これは、問題を再現するために使用しているサンプルコードです。自由に変更し、これを解決するのに役立つと思われるものをお勧めします。 CREATE TABLE testT ( [Default_Collation] [NVARCHAR] (50) COLLATE DATABASE_DEFAULT, [Latin1_General_CI_AS] [NVARCHAR] (50) COLLATE Latin1_General_CI_AS, [Latin1_General_CI_AI] [NVARCHAR] (50) COLLATE Latin1_General_CI_AI, [SQL_Collation] [NVARCHAR] (50) COLLATE SQL_Latin1_General_CP1_CI_AS); CREATE UNIQUE CLUSTERED INDEX [IX_TestT] ON [dbo].[testT] ([Default_Collation]) ON [PRIMARY] GO INSERT INTO testT SELECT N'Șc', --COLLATE Latin1_General_CI_AS N'Șc', --COLLATE …

5
変数としてのCaseステートメントで100を超えるエントリを持つ方法
単純なクエリの4か所で同じステートメントを使用している> 100の選択肢を含むcaseステートメントを記述しました。 同じクエリを2回実行し、それらを結合したものもカウントしているため、group byにもcaseステートメントが含まれています。 これは、同じ会社の異なるレコードの綴りが異なるいくつかの会社名のラベルを変更するためです。 変数をVarChar(MAX)として宣言しようとしました declare @CaseForAccountConsolidation varchar(max) SET @CaseForAccountConsolidation = 'CASE WHEN ac.accountName like ''AIR NEW Z%'' THEN ''AIR NEW ZEALAND'' WHEN ac.accountName LIKE ''AIR BP%'' THEN ''AIR BP'' WHEN ac.accountName LIKE ''ADDICTION ADVICE%'' THEN ''ADDICTION ADVICE'' WHEN ac.accountName LIKE ''AIA%'' THEN ''AIA'' ... selectステートメントで使用すると、クエリはcaseステートメントをテキストとして返し、評価しませんでした。 また、グループで使用することもできませんでした-次のエラーメッセージが表示されました。 Each GROUP …

2
HTMLコードをXMLとして読み取り、SQLのサンプルのような出力を取得する方法
データベースにHTMLコードが格納されていて、それをXMLとして読みたい。 私のコード: http://rextester.com/RMEHO89992 これは私が持っているHTMLコードの例です: <div> <section> <h4> <span> A </span> </h4> <ul> <li> <span> Ab</span> AD <span> AC </span> </li> <li> <span> Ag</span> <span> AL </span> </li> </ul> <h4> <span> B </span> </h4> <ul> <li> <span> Bb</span> BD <span> BC </span> </li> <li> <span> Bg</span> <span> BL </span> </li> </ul> …
11 sql-server  t-sql  xml 

4
SET操作に参加できるローカル変数の最大数はいくつですか?
ビジネスロジックを含むストアドプロシージャがあります。その中には約1609の変数があります(理由は聞かないでください、これがエンジンのしくみです)。SET変数を他のすべての変数の連結値にしようとしています。結果として、作成中にエラーが発生します。 メッセージ8631、レベル17、状態1、手順XXX、行YYY内部エラー:サーバーのスタック制限に達しました。クエリで潜在的に深い入れ子を探し、それを単純化してみてください。 エラーは、SET操作で使用する必要がある変数の数が原因であることがわかりました。2つに分けて割り当てができます。 私の質問は、この領域にいくつかの制限があるのですか?チェックしましたが何も見つかりませんでした。 このKBに記載されているエラーを確認しましたが、これは私たちのケースではありません。CASEコード内では式を使用しません。その一時変数を使用して、CLR関数を使用して置き換える必要がある値のリストを準備します。SQL ServerをSP3 CU6(最新)に更新しましたが、まだエラーが発生しています。

10
標準SQLまたはT-SQLで1、2、3、3、2、1、1、2、3、3、2、1、…シリーズを生成する方法は?
二つの数を考えるnとm、私は、フォームのシリーズを生成したいです 1, 2, ..., (n-1), n, n, (n-1), ... 2, 1 そしてそれを繰り返しmます。 たとえば、n = 3およびの場合、m = 4次の24個の数字のシーケンスが必要です。 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 ---------------- ---------------- ---------------- ---------------- PostgreSQLでこの結果を2つの方法のいずれかで達成する方法を知っています。 generate_series関数を使用する次のクエリと、順序が正しいことを保証するためのいくつかのトリックを使用します。 WITH parameters (n, …

1
CEILINGを使用するとCASE式が誤った値を返す
CASE式が期待どおりの結果を返さないという問題に遭遇しました。 テストとして、10進数の変数を追加して同じCASE式を実行し、期待どおりに結果を返します(IsGun=1ただし、の場合は値を切り上げます。ただし、同じCASE式を別の10進数の値に対して実行すると、常に戻りますCEILING()関数の値であり、元の値を返すことはありません。 SQLコードは次のとおりです。 DECLARE @Num decimal(8,2); set @Num = 12.54; WITH PQ AS ( SELECT UPC, Price1, DBID, AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg FROM vProducts_PriceQty_Union ) SELECT PQ.UPC, PQ.Price1, PQ.Price1Avg, (CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar, CAST( (CASE WHEN P.IsGun = 1 …

4
「Id」の形式:YYYYNNNNNN、NNNNNNパートは毎年再開
Invoiceテーブルの各レコードがYYYYNNNNNNのようなIDを持つというビジネス要件があります。 NNNNNN部分は、毎年初めに再始動する必要があります。したがって、2016年に入力された最初の行は2016000001のようになり、2番目は2016000002のようになります。2016の最後のレコードが2016123456だったとします。(2017の)次の行は2017000001のようになります。 このIDを主キーにする必要はなく、作成日も保存します。アイデアは、この「表示ID」は一意であり(それでクエリできるため)、年ごとに人間でグループ化できるということです。 レコードが削除されることはほとんどありません。しかし、私はそのようなものに対して防御的にコーディングする傾向があります。 今年、新しい行を挿入するたびに最大IDを照会しなくても、このIDを作成できる方法はありますか? アイデア: その年CreateNewInvoiceSPのMAX値を取得するA (yucky) これを正確に行うためのいくつかの魔法の組み込み機能(私は夢を見ることができます) IDENTITYor DEFAULT宣言でUDFまたは何かを指定できること(??) を使用するビューPARTITION OVER + ROW()(削除すると問題が発生します) トリガーINSERT(まだMAXクエリを実行する必要があります:() 毎年のバックグラウンドジョブで、毎年挿入されるMAXを使用してテーブルを更新しました。 これらはすべて、理想的ではありません。どんなアイデアやバリエーションでも大歓迎です!
11 sql-server  t-sql 

1
このwhileループで明示的なトランザクションが必要ですか?
SQL Server 2014: 非常に大きな(1億行)テーブルがあり、その上のいくつかのフィールドを更新する必要があります。 ログシッピングなどの場合も、一口サイズのトランザクションを維持する必要があります。 以下を少し実行してからクエリをキャンセル/終了すると、これまでに行われた作業はすべてコミットされますか、いつでもキャンセルできるように明示的なBEGIN TRANSACTION / END TRANSACTIONステートメントを追加する必要がありますか? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' …

2
データベースSQL Server 2012をミラーリングできません
次のコマンドを使用してデータベースをミラーリングしようとした場合 ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ 次のエラーが表示されます メッセージ1475、レベル16、状態105、行1 データベース「test0916aj8CJ」には、バックアップされていない一括ログ変更が含まれている場合があります。プリンシパルデータベースまたはプライマリデータベースでログバックアップを作成します。次に、このバックアップをミラーデータベースで復元してデータベースミラーリングを有効にするか、すべてのセカンダリデータベースで復元して、可用性グループに参加できるようにします。 データベースをバッキングせずにこれを実行できますか?または、バックアップしてからバックアップを破棄する必要があります。新しく作成されたデータベース用なので、この時点ではバックアップは必要ありません。 私は以下を試しました... BACKUP DATABASE [test0916aj8CJ] TO DISK = N’NUL’ WITH COPY_ONLY, NOFORMAT, INIT, NAME = N’test-Full Database Backup’, SKIP, NOREWIND, NOUNLOAD GO しかし、上記の方法も機能しませんでした。 ありがとう

3
「WITH NOCHECK」を使用して外部キーを作成すると、何が失われますか?
EXISTS()FKルックアップ値で呼び出しを行うと、そのFK制約が信頼できる場合、結果はすぐにわかります。 そして、それが信頼されていない場合(を使用してFKを作成するときなどWITH NOCHECK)、SQL Serverはテーブルに移動して、値が実際に存在するかどうかを確認する必要があります。 他に使用することで失うものはありNOCHECKますか?

1
複数のサーバーログインの1人のデータベースユーザーへのマッピング
これは馬鹿げた質問のようですが、いくつかの調査にもかかわらず、(おそらく間違った用語を使用したために)これに関する情報を見つけることができませんでした。 複数のサーバーログイン(SQLサーバー認証)を単一のデータベースユーザー(データベースロールのメンバーとして割り当てられたアクセス許可を持つ)に記録することはできますか? 中央データベースから1つの設定を読み取る必要がある数十のSQLログイン(SQLサーバー認証)があり、ログインごとに独自のDBユーザーを作成するのではなく、これらのすべてのログインをターゲットデータベースの単一のDBユーザーにマッピングしたいと思います。 はいの場合、正しいT-SQL構文は何ですか?

4
特定のユーザーのクエリが遅い
C#.NET Webアプリケーションから呼び出されるクエリがいくつかあります。これは常に高速です(SQL Serverのローカル管理者です)が、ユーザーのグループ(必要な権限を持つドメイングループ)の場合、クエリはアプリケーションでタイムアウトするポイント。 まったく同じクエリがユーザーごとに異なる動作をする原因は何ですか? より詳しい情報: クエリは、ストアドプロシージャではなく、C#コードのインラインSQLです。 アプリはドメイン認証を使用し、ユーザーと私はアプリを通じてクエリを実行します 問題は別のプランであるようで、1つはキャッシュされたため、ユーザーごとに異なっていました。クエリがアプリ経由で遅くなり、SQL Server Management Studioで高速になるため、何かがキャッシュに影響しています。

2
1つのメインジョブから複数のSQL Serverエージェントジョブを順番に呼び出す良い方法は?
順次実行する必要があるSQL Serverエージェントジョブがいくつかあります。実行する必要があるジョブの概要をわかりやすくするために、への呼び出しで他のジョブを呼び出すメインジョブを作成しましたEXEC msdb.dbo.sp_start_job N'TEST1'。はsp_start_job即座に終了しますが(ジョブステップ1)、TEST1次のジョブを呼び出す前に、ジョブが終了するまでメインジョブを待機させます。 そのため、ジョブが呼び出された直後に実行を開始し(ジョブステップ2)、メインジョブを強制的にサブジョブが完了するまで待機させる次の小さなスクリプトを記述しました。 WHILE 1 = 1 BEGIN WAITFOR DELAY '00:05:00.000'; SELECT * INTO #jobs FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;', 'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'', @execution_status = 0, @job_aspect = N''JOB'''); IF NOT (EXISTS (SELECT top 1 * FROM #jobs)) BEGIN BREAK END; DROP TABLE #jobs; END; これは十分に機能します。しかし、私はよりスマートで安全な(WHILE 1 = …

5
100mmレコードでJOINを使用して更新します。これをより適切に行う方法は?(T-SQL)
実際には、1つのテーブルの1億レコードを更新する必要があります。つまり、列のvarchar値を単にIDに置き換えることでテーブルを正規化します。(「置換」と言いますが、実際にはIDを別の列に書き込んでいます。) 私が達成しようとしているのは、データセットを正規化することです。まだ正規化されていないデータにはインデックスがありません。私の考えは、更新が完了した後、varchar値をtinyint値で置き換える外部キーにインデックスを付けるのを待つ代わりに、生の値にインデックスを構築しないことでした。 UPDATE A SET A.AutoClassID = B.AutoClassID FROM AutoDataImportStaging.dbo.Automobile as A JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName) バックグラウンド サーバー2008 R2でMSSQL 2008 R2を使用 サーバーには8 GBのRAMがあります サーバーには1つのRAID10、7200 RPM SATAがあります(すばらしいですが、本番環境ではこれはデータの読み取りのみを行い、データの書き込みは行いません。さらに、最近のHDの不足により、コストのためにこれが必要になりました)。 サーバーにはデュアルクアッドコアXeon CPUが搭載されています マシンは他に何もしていません(現在は開発専用で、このプロセスのみ) 単純なロギングがオン(?-しかし、ロールバックできるようにログを記録しますか?) クエリは2つの異なるDBを参照することに注意してください。 更新されるテーブルのレコードの「幅」は455バイトです 実行中のリソース 物理RAMがいっぱいです ディスクI / Oが最大になりました CPUはほとんど何もしていません(チョークポイントはI / Oです) 実行時間は14時間で、カウントされています! 正規化の更新後に列(AutoClassName)を削除する場合でも、生データのインデックスが必要になるなど、いくつかのことが疑われます。また、JOINを開始するときにばかげて見えたJOINではなく、一度に1レコードずつテーブルをループダウンする必要があるのか​​どうかも疑問に思っていましたが、今はもっと高速だったようです。 残りの正規化更新(これと同様)の方法をより迅速に変更するにはどうすればよいですか?

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