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

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

2
SSMSと登録済みサーバーの結果
背景: 私たちは、AGのサポートチームの1つに「主要な」AGテストハーネスを作成しようとしています。ある時点でどのサーバーがプライマリになるかがわからないため、登録されたサーバーグループに対してTSQLを実行するように指示されています。登録されたサーバーグループは、AG内のすべてのサーバーで構成されます。目標は、現在のプライマリサーバーでのみTSQLを実行することです。 現在のテストハーネス: IF EXISTS (SELECT * FROM sys.dm_hadr_availability_replica_states AS HARS INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME)) BEGIN <<SOME CODE TO EXECUTE>> END 問題点: マルチサーバークエリに応答する最初のサーバーが結果を返さない場合、他のサーバーが後で結果セットを返しても、SSMSは正しい結果セットが結果セットではないと想定します。したがって、このシナリオでは結果は返されません...これは正しくなく、期待される機能ではありません。 SSMS(これはCSチームにとって最も身近なツールです)を使用して、現在のプライマリサーバーでのみ実行を強制する方法を誰かが考えることができますか?

3
新しく作成された列に挿入することはできません
私はこのような簡単なテストテーブルを持っています: CREATE TABLE MyTable (x INT); トランザクション内で、列を追加してから、新しく作成した列に挿入しようとしています。 BEGIN TRANSACTION; PRINT 'Adding column, ''SupplementalDividends'', to MyTable table.'; ALTER TABLE MyTable ADD SupplementalDividends DECIMAL(18,6); PRINT 'Column added successfully....'; PRINT 'Ready to INSERT into MyTable ...'; INSERT INTO MyTable (x, SupplementalDividends) VALUES (1, 3.2); PRINT '**** CHANGES COMPLETE -- COMMITTING.'; COMMIT TRANSACTION; 上記のコードを実行すると、問題はエラーメッセージになります。 …

1
フォルダー内の複数の.DTSXパッケージファイルのPackageFormatVersionを決定する
Kenneth Fisherが、私のSSISパッケージとはどのSQLバージョンであるかを判断する方法についてブログ投稿しました。2015年4月。 これにはPackageFormatVersion、XMLメタデータで見つかったSSISパッケージのどれにSQLバージョンがマップされているかのテーブルがあります。これは、1つの個別のパッケージを確認するときに役立ちます。 約100のSSIS .DTSXパッケージのフォルダーがあり、それらのSQLバージョンをすべて知る必要があります。 フォルダー(ファイルシステム)内のPackageFormatVersion複数の.DTSXパッケージの何(つまり、SQLバージョン)を一括して決定することができますか? 最終的な目標は、現在ソース管理システムが存在しないため、これらのパッケージを取得するために取得および実装する適切なTFSバージョンを決定することです。Kennethが提示する表は、この質問に答えるのに役立ちますが、最初に、SQLバージョンのパッケージを確認する必要があります。 BIDSもSSDTもインストールされていないとします。 必要な出力が次のようなものであると想定します。ここで、pipeは新しい列を指定します。 PackageFilename | PackageFormatVersion -------------------------------------- Package1.dtsx | 3 Package2.dtsx | 4 PowerShell、TSQL、ディレクトリ構造をクロールできるサードパーティツール、またはその他のツールを歓迎します。

4
トリガーでSELECT * okです。または私はトラブルを求めていますか?
私は仕事で議論に巻き込まれ、見落としている可能性のある落とし穴についてアドバイスが必要です。 削除されたレコードを監査テーブルにコピーするためにトリガーが使用されるシナリオを想像してみてください。トリガーはSELECT *を使用します。誰もが指さして叫び、これがどれほど悪いかを私たちに教えます。 ただし、メインテーブルの構造に変更が加えられ、監査テーブルが見落とされた場合、トリガーによってエラーが生成され、監査テーブルにも変更が必要であることを通知します。 このエラーは、DEVサーバーでのテスト中に検出されます。ただし、プロダクションがDEVと一致することを確認する必要があるため、プロダクションシステムでSELECT *を許可します(トリガーのみ)。 だから私の質問は:私はSELECT *を削除するようにプッシュされていますが、この性質の開発エラー、アイデア、またはこのベストプラクティスを自動的にキャプチャしていることを確認する他の方法がわかりませんか? 以下の例をまとめました: --Create Test Table CREATE TABLE dbo.Test(ID INT IDENTITY(1,1), Person VARCHAR(255)) --Create Test Audit Table CREATE TABLE dbo.TestAudit(AuditID INT IDENTITY(1,1),ID INT, Person VARCHAR(255)) --Create Trigger on Test CREATE TRIGGER [dbo].[trTestDelete] ON [dbo].[Test] AFTER DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; …

2
自己参照(階層)テーブルからツリー構造を取得できますか?
次のような階層テーブルがあるとします。 CREATE TABLE [dbo].[btree] ( id INT PRIMARY KEY , parent_id INT REFERENCES [dbo].[btree] ([id]) , name NVARCHAR(20) ); ツリー構造全体を取得したいのですが。 たとえば、次のデータを使用します。 INSERT INTO [btree] VALUES (1, null, '1 Root'); INSERT INTO [btree] VALUES (2, 1, '1.1 Group'); INSERT INTO [btree] VALUES (3, 1, '1.2 Group'); INSERT INTO [btree] VALUES (4, …

2
この選択で1回のシークで同じ結果を取得する方法はありますか?
クエリを変更するか、オプティマイザの戦略に影響を与えることにより、1回のシークまたはスキャンで次と同じデータを取得することは可能ですか? これに類似したコードとスキーマは現在SQL Server 2014にあります。 再現スクリプト。セットアップ: USE tempdb; GO IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL DROP TABLE dbo.TestUpload; CREATE TABLE dbo.TestUpload( JobRunId bigint NOT NULL, ThingAName nvarchar(255) NOT NULL, ThingAType nvarchar(255) NOT NULL, ThingAGranularity nvarchar(255) NOT NULL, ThingBName nvarchar(255) NOT NULL, ThingBType nvarchar(255) NOT NULL, ThingBGranularity nvarchar(255) NOT NULL ); CREATE …

2
複数のストアドプロシージャで同じコード
最近入社しましたが、多くのストアドプロシージャに同じコードセクションが繰り返し含まれていることに気づきました。発生したすべてのSPでそのコードの小さなセクションを変更する必要があったので、気が付きました:) これはかなり大きなコードの塊で、約30行です。コードはinsertステートメントの一部であり、基本的には4つのテーブルをWHERE/AND、SP間で実際に変更されない条件と一緒に結合します。以下のようになります。 ... ... FROM <TableOne> INNER JOIN <TableTwo> ON ... AND ..... AND ..... LEFT JOIN <TableThree> ON ... AND ..... AND ..... WHERE ..... AND ..... AND ..... AND MedicalPlanCode IN ('abc', 'def', 'ghi') SPからSPに変更される唯一の部分は値('abc'、 'def'、 'ghi')です。 また、これらの値の量が異なる場合があるため、一部のSPには2つの値があり、他のSPには5つの値があります。 私が考えるすべてのことは、コードのそのセクションを動的SQLに変更し、それが価値があるかどうかはわかりません。しかし、私のプログラマはこの状況を嫌っています。 なんらかのコードの再利用を実装する必要がありますか?ROIはありますか?私のオプションは何ですか?約100のストアドプロシージャを実行する必要があり、約1時間かかりました。 100個のSPは、20以上の異なるデータベースに分散しています。ビューを作成する権限があります。

2
[0-9]は数字、[az]は文字のように、句読点に相当するT-SQLはありますか?
句読点を含む列から値をプルできるようにする[0-9]および[a-z]パターンに相当するT-SQLはありますか? 例えば: Create Table #Test ( Value VarChar(10) ) Insert Into #Test Values ('123a'), ('456b'), ('12ABC'),('AB!23'),('C?D789') Select * From #Test Where Value like '[0-9][0-9][0-9][a-z]' これは、最初の3文字が0から9までの数字で、最後の文字がaからzまでの文字である値を返すため、123aおよびなど456bの値を返しますが、の値は返しません12ABC。 句読点に相当するもの[0-9]が数字や[a-z]文字にあるかどうか知りたいので、返さAB!23れC?D789ますか? 正規表現を使用できる場合^[a-zA-Z0-9]*$、文字列内の英数字に一致する表現を使用する可能性があります。 Where Value like '^[a-zA-Z0-9]*$' これに相当するSQLはありますか? RegExで実行できるこの種のことは知っていますが、T-SQLでそれが必要です。このサーバーにカスタムアセンブリをロードできないため、正規表現を使用できません。 実際の列はvarchar(200)です。照合順序は、Latin1_General_CI_ASです。SQL Server 2012 Standard Editionを使用しています。

4
完了する前にストアドプロシージャから応答を取得する方法
終了する前に、ストアドプロシージャから部分的な結果(単純な選択として)を返す必要があります。 それは可能ですか? はいの場合、それを行う方法は? そうでない場合、回避策はありますか? 編集:私は手順のいくつかの部分を持っています。最初の部分では、いくつかの文字列を計算します。追加の操作を行うために、手順の後半でそれらを使用します。問題は、呼び出し元が文字列をできるだけ早く必要とすることです。そのため、その文字列を計算してそれを(どういうわけか、たとえばselectから)返し、それから作業を続ける必要があります。発信者は、貴重な文字列をはるかに迅速に取得します。 呼び出し元はWebサービスです。

1
値で均等に分散されたグループに分割されたデータを選択します
グループ内の値の合計が可能な限り均等に分散されているテーブルからデータを4つのグループに選択したいと思います。私はそれを十分に明確に説明していないと確信しているので、例を挙げようと思います。 ここでは、NTILE(4)を使用して4つのグループを作成します。 SELECT Time, NTILE(4) OVER (ORDER BY Time DESC) AS N FROM TableX Time - N ------------- 10 - 1 9 - 2 8 - 3 7 - 4 6 - 1 5 - 2 4 - 3 3 - 4 2 - 1 1 - 2 上記のクエリと結果では、他の列は簡潔にするために省略されています。 したがって、次のようにグループを表示することもできます。 …

3
挿入時にデフォルトで生成された一意の識別子を返します
ゴール テーブルに値を挿入した後、リアルタイムで最新のGUID値を取得します 問題 それを行う方法がわからない 情報 コードは住所と郵便番号の新しい値のみを指定する必要があります テーブルには多くのデータが含まれる可能性があります テーブル CREATE TABLE [AddressBook] ( [testID] [uniqueidentifier] NOT NULL default newid(), [address] [nvarchar](50) NULL, [zipcode] [nvarchar](50) NULL )

3
WHERE句を更新して、値が別のテーブルにないかどうかを確認する
私が使用するクエリ持っているWHERE句を、と私は起こるまったく同じ使用することWHEREで句多く、このテーブル上のクエリ(ら)。 クエリは次のとおりです。 SELECT DATENAME(DW, [AtDateTime]) AS [Day of Week] ,COUNT(*) AS [Number of Searches] ,CAST(CAST(COUNT(*) AS DECIMAL(10, 2)) / COUNT(DISTINCT CONVERT(DATE, [AtDateTime])) AS DECIMAL(10, 2)) AS [Average Searches per Day] ,SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END) AS [Number of Searches with no Results] ,CAST(CAST(SUM(CASE WHEN [NumFound] …

1
条件付きの一意の識別子フィールド
私は稼働していないデータベースを持っているので、メインテーブルはCustodyDetailsで、このテーブルにはID int IDENTITY(1,1) PRIMARY KEY列があり、他のテーブルで参照されていない別の一意の識別子を追加する方法を探しています。アカウントの内容は、正確にはIDキーではありません。 ただし、この新しいID列にはいくつかの具体的な詳細があり、ここから問題が始まります。フォーマットは次のとおりです。XX/YYどこXXはリセットが/すべての新しい年に再起動することを自動incrementable値であり、YYは現在の年の最後の2桁ですSELECT RIGHT(YEAR(GETDATE()), 2)。 したがって、たとえば、レコードから開始日追加されたふりをすることができます1 28/12/2015終了2016年3月1日には、カラムは次のようになります。 ID ID2 DATE_ADDED 1 1/15 2015-12-28 2 2/15 2015-12-29 3 3/15 2015-12-30 4 4/15 2015-12-31 5 1/16 2016-01-01 6 2/16 2016-01-02 7 3/16 2016-01-03 フロントエンドを使用してコンポジットID(例ではID2)を解析し、最後の2桁を取得して現在の年の最後の2桁と比較し、新しい相関を開始するかどうかを決定することを考えました。もちろん、データベース側でそれをすべて実行できることは素晴らしいことです。 編集1:ところで、私は人々が並列のIDキーを格納するためだけに別々のテーブルを使用しているのを見たので、1つのテーブルのIDキーは2番目のテーブルのセカンダリキーになります、これは少しおかしな話に聞こえますが、おそらくこれはそのような実装が行われるケースですか? 編集2:この追加の IDは、すべてのファイル/レコードにラベルを付けるレガシードキュメント参照です。私はそれをメインIDの特別なエイリアスと考えることができると思います。 このデータベースが毎年処理するレコードの数は、過去20年間で100を超えていません。もちろん、99を超えるとフィールドでできることはほとんどありません(実際には、非常に非常に)。追加の桁で続行すると、フロントエンド/手順は99を超えることができるため、状況が変わることはありません。 もちろん、最初に言及しなかったこれらの詳細の一部は、特定のニーズに合わせてソリューションの可能性を絞り込むだけなので、問題の範囲をより広く保つことを試みました。

2
SQL Server 2008:毎日再起動するシーケンス
:私は、次の形式の文字列を使用して列を更新する必要があり、トリガーを追加する必要があり<current_date>_<per_day_incremental_id>、例えば2015-10-01_36。IDは増分である必要があり、ギャップは許容されます。 私のアプローチはかなり素朴です。現在の日付と現在のシーケンス値でテーブルを作成し、その中に単一のレコードを保持します。 create table DailySequence ( date date, sequence int ) insert into DailySequence values (getdate(), 1); CREATE TRIGGER MakeHumanReadableId ON dbo.AuditMeasures FOR INSERT AS DECLARE @ret int; DECLARE @tempDate date; DECLARE @nowDate date; SET @nowDate = getdate(); SELECT @ret = t.sequence, @tempDate = t.date from DailySequence as t; IF …

1
以下のクエリから階層値を取得するにはどうすればよいですか?
という名前Categoryの列を持つテーブルという名前のテーブルがありますCategoryID。と呼ばれる同じテーブルに参照列がありますfParentCategoryID。 すべてのカテゴリIDとそのサブカテゴリIDをカンマで区切る必要があります。例 -10の親カテゴリIDが1で、20の親カテゴリIDが10の場合、カテゴリID 20を印刷するとき、1と10の両方を親としてカンマ区切り値で印刷する必要があります。 以下のクエリを試してみましたがNULL、ParChild列が表示されます。助けてください。 ;WITH cteReports AS ( SELECT c.CategoryID, c.fParentCategoryID, [level] = 1, ParChild=cast(CAST(c.fParentCategoryID AS VARCHAR(200)) + ',' + CAST(c.CategoryID AS VARCHAR(200)) AS VARCHAR(MAX)) FROM retail.Category c WHERE c.fParentCategoryID is NULL UNION ALL SELECT c.CategoryID, c.fParentCategoryID, [level] + 1, ParChild = ParChild + ',' + CAST(c.CategoryID AS VARCHAR(200)) …

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