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

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

3
存在しない場合は、コードによって新しい関数を作成します
データベースにスクリプトで新しい関数を作成したい。スクリプトコードは次のとおりです。 IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End しかし、上記のスクリプトを実行すると、SQL Serverはエラーを返します。 'CREATE FUNCTION' must be the first statement in a query batch.

2
「SELECT POWER(10.0、38.0);」が算術オーバーフローエラーをスローするのはなぜですか?
私は更新しています私のIDENTITYオーバーフローチェックスクリプトをのアカウントにDECIMALしてNUMERIC IDENTITY列。 チェックの一環として、すべてのIDENTITY列のデータ型の範囲のサイズを計算します。それを使用して、その範囲の何パーセントが使い果たされたかを計算します。以下のためにDECIMAL及びNUMERIC その範囲のサイズである2 * 10^p - 2場合pの精度です。 私はテストを持つテーブルの束を作成DECIMALし、NUMERIC IDENTITY列を、次のようにその範囲を計算しようとしました。 SELECT POWER(10.0, precision) FROM sys.columns WHERE is_identity = 1 AND type_is_decimal_or_numeric ; これにより、次のエラーがスローされました。 Msg 8115, Level 16, State 6, Line 1 Arithmetic overflow error converting float to data type numeric. IDENTITYタイプの列DECIMAL(38, 0)(つまり、最大精度)に絞り込んだのでPOWER()、その値で直接計算を試みました。 以下のすべてのクエリ SELECT POWER(10.0, 38.0); SELECT CONVERT(FLOAT, (POWER(10.0, 38.0))); …

2
SQL Server Decimal(9、0)vs INT
顧客の1人がDECIMAL(18,0)、SQL Server 2008R2データベースのデータ型を一部の列に使用しています。列の成長が非常に遅いため、彼は最近、データ型を変更してDECIMAL(5,0)ストレージを回復することを提案しました。 MSDNライブラリによると、DECIMAL(5,0)データ型の記憶領域は、データ型と同様DECIMAL(9,0)に5バイトです。INT1バイト小さくなりますが、格納できる-99,999〜99,999の代わりに-2 ^ 31〜2 ^ 31の範囲ですべてをDECIMAL(5,0)格納できます。DECIMAL5バイト(DECIMAL(9,0))に収まる最大サイズでも、-999,999,999から999,999,999の範囲の整数のみを格納できます(INT4バイトで提供される範囲の半分未満です)。 DECIMALover を使用することの2つの「メリット」を考えることができますINT。 後でストレージ容量を使用せずにスケールを追加する機能 データ型を変更せずに、38桁まで精度をスケーリングする機能 しかし、これらは私の意見では本当の利点ではありません: 整数へのスケールの追加は、ごくわずかな場合にのみ意味があります(スケールが違いを生むほとんどの場合、事前に追加することもできます) SQL Serverは、すべての精度/スケールの組み合わせを異なるデータ型と見なします。そのため、精度またはスケールを増やしても、データ型はそのままではありません。 これは私に疑問を抱かせます:DECIMAL(5,0)整数のデータ型の追加の利点は何ですか?

6
SQL ServerはGREATESTとLEASTをサポートしていますか?サポートされていない場合、一般的な回避策は何ですか?
この質問を検討すると、それは必要のない多くの作業のようです。彼らは日付で範囲を拡大しようとしています。他のデータベースでは、単にgreatestandを使用しleastます。 least(extendDate,min), greatest(extendDate,max) これらを使用しようとすると、 'least' is not a recognized built-in function name. 'greatest' is not a recognized built-in function name. それはどちらの方向への拡張もカバーします。 質問の目的のために、あなたはまだ排他的な範囲置換をしなければならないでしょう。 SQL Serverユーザーがどのようにクエリパターンを実装して模倣するかleast、greatest機能するのか疑問に思っています。 PostgreSQL GREATEST/LEAST MySQL GREATEST/LEAST MariaDB GREATEST LEAST DB2 GREATEST LEAST オラクル GREATEST LEAST 条件をCASEステートメントに展開しますか、またはこの機能を有効にする拡張機能、サードパーティのアドオン、またはマイクロソフトからのライセンスがありますか?

5
手書きのコードでSQL Serverのブラケット表記を使用するのは理にかなっていますか?
コードジェネレーターは[]、ほぼすべてに対して新しいMicrosoftブラケット表記()を使用して出力を生成する場合、より単純になる傾向があります。 最初に見たとき、やや禁止された引用識別子表記法の生まれ変わりをすごいけど。 私の知る限り、Microsoft独自の拡張機能です(つまり、Oracleはサポートしていません)。 SQL Serverを見ると、次のようなテーブルを定義しても違いはありません。 CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]); または CREATE TABLE dbo.Table_2 (col1 int, col2 int); それは個人的または企業スタイルの問題です。一貫してください。 データベースをOracleに移行する場合、括弧はオプションではありません。 古い引用識別子を使用できますが、これらは大文字と小文字を区別するため、多くの問題を引き起こします。 生成されたコードからすべてのブラケットを削除し、名前に空白、他の特殊文字、予約キーワードを使用することを避け、ほとんどのDBMSが理解できる方法でコードを作成することをお勧めしますか?

1
SQL ServerでBase64文字列をネイティブにデコードする
私が持っているvarchar、私はそれのプレーンテキスト同等にデコードしたいBase64でエンコードされたテキスト文字列を保持するSQL Serverのテーブルのカラムを SQL Serverには、このタイプのものを処理するためのネイティブ機能がありますか? base64文字列の例: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== デコードするもの: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

1
複数のCOUNTがCASEの1つのSUMよりも速いのはなぜですか?
次の2つのアプローチのどちらが速いかを知りたかったのです。 1)3つCOUNT: SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Approved'), Valid = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Valid'), Reject = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Reject') 2)SUMとFROM-clause: SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END), …

1
C#コードおよびストアドプロシージャでトランザクションを処理する必要がありますか
データベースストアプロセスとC#の両方でトランザクション処理が本当に必要ですか? C#: Using(transaction with transaction scope) { Execute stored proc; Transaction. Complete; } SQLストアドプロシージャ: Create process As Begin try Begin transaction Commit End try Begin catch Rollback End catch

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
インデックススプールの強制
パフォーマンス上の理由で避けるべきものを知っていますが、表示されないようにする方法のデモとして表示される状態を表示しようとしています。 ただし、インデックスが欠落しているという警告が表示されますが、オプティマイザーは一時インデックスを作成しないことを選択します。 私が使用しているクエリは SELECT z.a FROM dbo.t5 AS z WITH(INDEX(0)) WHERE EXISTS ( SELECT y.a FROM dbo.t4 AS y WHERE y.a = z.a ) OPTION (MAXDOP 1); テーブルスキーマは次のとおりです。 CREATE TABLE dbo.t4 ( a integer NULL, b varchar(1000) NULL, p varchar(100) NULL ); CREATE TABLE dbo.t5 ( a integer NULL, b …

2
CREATE VIEWでWITHを使用したTransact SQL
WITH句を使用してVIEWを作成したいのですが、実際には正しい構文に関する参照が見つかりません。 こんな感じ WITH TempTbl AS (SELECT ...) CREATE VIEW SomeView SELECT * FROM TempTbl そして、いくつかのWITH句を使用するための正しい構文は何ですか? MSDNで有用なものはありません:(
13 t-sql  view 

2
1000ページの制限に達するオンラインページの復元
(I / O障害により修正された)破損に苦しんでいるデータベースを回復しようとする仕事をしました。私は、データベースまたはデータベースに含まれる内容に詳しくありません。 古い(最大3週間)フルバックアップと一連のトランザクションログが与えられました...しかし、トランザクションログが欠落しているため、特定の日付までしか回復できません。2.5週間分のデータが失われています(このデータベースには常に多くのデータが追加されています)。 また、破損したデータベースのコピー(アクセス可能ですが、多くのページが破損/欠落しています)のコピーも提供されています。 私は典型的なDBCC CHECKDBコマンドを試してみました(まだありrepair_allow_data_lossません。他に何も機能しない場合、それは私の最後の手段になります)。 多くの人がデータベースに出入りした後(dbは1.5テラバイトの小さな怪物で、私がすることはすべて遅くて時間がかかります)、破損したページの最後の正常なバックアップからオンラインページの復元を試みました。 それを行うためにRESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'、DBCC CHECKDB出力から多くのコマンドを作成するスクリプトを作成しました(基本的には正規表現と異なる)...これまでのところ、これは1000ページの制限に達したと言った時点まで機能しました復元コマンドごとにファイルごと(このデータベースには8つのファイルがあります)。 そのため、「オンライン復元を完了する」ように求められますが、それを行う方法に途方に暮れています...私はテールログまたは最初の完全バックアップよりも完全なものを持っていないので、基本的に、残りのページで試行を続けるために復元を完了する方法がわかりません。 私は試してみましたRESTORE DATABASE <foo> WITH RECOVERYが、それでもうまくいきませんでした、私は持っていないログを要求します。 誰かがここから何かを回復しようとする方法についてのヒントを持っていますか?または、オンライン復元を「完了」して、さらに多くのページを復元しようとする方法はありますか?オフライン復元を試しても同じ問題が発生しますか(基本的WITH NORECOVERYにすべてを追加してから、最後に復元しようとしますか?) データベースを手作業で処理することは基本的に元に戻せません...数百万の行を持つ数百のテーブルがあり、それが何であるかについて明確な意味はありません。SELECT数百万行を超えると、破損したDBはクエリで失敗しますが、どこで解決できるかはわかりません。すべての非クラスター化インデックスを再構築しようとしましたが、行データを含む破損したページがあるため、どちらも機能しませんでした。 ある程度のデータ損失は許容されますが、DBでの一貫性の達成は少なくとも試みられるべきです。 破損したデータベースはまだオンラインであり、クライアントが作業しているため(新しいデータを取得し続けます)、ラボベンチで行うすべてのプロセスは、後で運用データベースで再現可能です(ダウンタイムは困難です)。 これはSQL Server 2014 Enterpriseです PS:私はDBAではありません...私はプログラマーですが、クライアントはいくつかの「エキスパート」SQLディザスタリカバリサービスを試してみましたが、彼らはあきらめました。何でもする。 更新:多くのテストの後、ページごとの復元は不要でしたので、アイデアを捨てました。手動リカバリ(破損したテーブルから不足しているレコードを手動で選択し、最後の既知の正常なバックアップに挿入する)を行い、自動化ツールを使用します(再び、何百ものテーブルがあります)。

4
このWHERE句の%は何をしますか?
私はトレーニングを行っていますが、スクリプトの1つに次のコマンドがあります。 SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1 WHERE句でこのスニペットの目的を知りたい: Col1 % 3 = 1 私はインターネットでいくつかの調査を行ったが、このコマンドに関する参照は見つかりませんでした。
13 sql-server  t-sql 

3
LIKE文字の長さ制限を克服する
ここでこのLIKE文字の長さの制限を読むと、LIKE句で〜4000文字より長いテキストを送信できないように見えます。 特定のクエリのクエリプランキャッシュからクエリプランをフェッチしようとしています。 SELECT * FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?' 内のクエリLIKEが4000文字より長い場合、クエリがキャッシュプランに含まれていても結果は0になります。(少なくともエロルが予想されていました)。 この問題を回避する方法はありますか?> 10000charsの長さのクエリがあり、> で検索できないようLIKEです。

1
「and」と「&」の違い
私は論理演算の優先順位を理解しようとしていますが、次のコードがあります: declare @T bit ='TRUE' declare @F bit ='False' print @T and @F そして、エラーを返します キーワード「and」付近の構文が正しくありません。 「and」を「&」に置き換えると、コードは再び機能します。前のコードが機能しなかったのはなぜですか?SQLサーバーを使用しています。
13 sql-server  t-sql 

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