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

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

1
COLUMNS_UPDATEDを使用して、特定の列のいずれかが更新されているかどうかを確認する方法
42列のテーブルと、これらの列のうち38列が更新されたときに何らかの処理を行うトリガーがあります。したがって、残りの4列が変更された場合、ロジックをスキップする必要があります。 私が使用することができUPDATE()関数と一つの大きな作成IF条件を、より短い何かをすることを好みます。COLUMNS_UPDATEDを使用すると、特定の列がすべて更新されているかどうかを確認できますか? たとえば、列3、5、および9が更新されているかどうかを確認します。 IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) PRINT 'Columns 3, 5 and 9 updated'; したがって、20列3との5値、および1列の値9は2番目のバイトの最初のビットに設定されているためです。ステートメントを変更するORと、列3および/ 5または列9が更新されているかどうかが確認されますか? OR1バイトのコンテキストでロジックを適用するにはどうすればよいですか?

2
PIVOTクエリのヘルプ
私は以下の構造を持つテーブルを持っています: CREATE TABLE [dbo].[AUDIT_SCHEMA_VERSION]( [SCHEMA_VER_MAJOR] [int] NOT NULL, [SCHEMA_VER_MINOR] [int] NOT NULL, [SCHEMA_VER_SUB] [int] NOT NULL, [SCHEMA_VER_DATE] [datetime] NOT NULL, [SCHEMA_VER_REMARK] [varchar](250) NULL ); いくつかのサンプルデータ(sqlfiddleに問題があるようです。 INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,7,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored …

2
MERGEはtempdbを使用しますか?
次のクエリを検討してください。 MERGE [Parameter] with (rowlock) AS target USING (SELECT @AreaId, @ParameterTypeId, @Value) AS source (AreaId, ParameterTypeId, Value) ON (target.AreaId = source.AreaId AND target.ParameterTypeId = source.ParameterTypeId) WHEN MATCHED THEN UPDATE SET target.Value = source.Value, @UpdatedId = target.Id WHEN NOT MATCHED THEN INSERT ([AreaId], [ParameterTypeId], [Value]) VALUES (source.AreaId, source.ParameterTypeId, source.Value); 統計I / …
12 sql-server  t-sql 

2
列定義の先頭または末尾に列エイリアスを配置することに違いはありますか?
私はいつも列エイリアスを次のように見て、書いてきました SELECT 1 as ColumnName しかし、今日使用したクエリに出くわしました SELECT ColumnName = 1 これら2つのクエリの実行方法に違いはありますか?または、どちらを使用するかについて、DBA間に標準はありますか? 個人的に私は、第二は、読み取り/(良い例を長い列定義に維持することが容易になるだろうと思いますここからこの記事私はすべきではない、いくつかの理由がある場合)、しかし、私は今日はとても疑問に思って前に使用第二構文を見たことがありませんそれを使用します。

4
SQL Server 2012は、テーブル名と列名を[括弧]で囲んでいます
Columnsフォルダーをエディターウィンドウにドラッグすると、列の完全なリストがブラケットなしで追加されます。列を個別にドラッグすると、ブラケットが表示されます。 とにかくそれをオフにする方法はありますか?私はオプションに何も見つけることができず、それらは本当に注意散漫です。


1
テストデータ用の大きな文字列の生成
ここで質問のための汎用テストデータを含むいくつかの大きな文字列を作成しようとしていました。文字列を乗算する方法を知っていたようです。ただし、構文を思い出せなくなりました。 私は次のようなものを探しています: SELECT 'A' + ('a' * 1000) + 'ha!' 「Aaaaaaaaaaaaaaaha!」を思い付くために (もちろん、もっと長いです。) T-SQLでこれは可能ですか?(または、他の言語を考えていますか?)また、大きな文字列を生成する他の技術はありますか?
12 sql-server  t-sql 

5
SQLストアドプロシージャを一度に1人で実行するように制限するにはどうすればよいですか?
基本的に、あるテーブルから値を選択して別のテーブルに挿入するストアドプロシージャがあります。これは一種のアーカイブです。複数の人が同時にそうするのを避けたいです。 このプロシージャが実行されている間、他の人がそれを開始できるようにしたくはありませんが、シリアライゼーションは必要ありません。他の人は、処理が終わった後にプロシージャを実行します。 私が欲しいのは、プロシージャを実行しているときに、他の人がそれを開始しようとしてエラーが発生することです。 私はsp_getapplockを使用して試しましたが、その人がプロシージャを実行するのを完全に止めることができません。 また、sys.dm_exec_requestsを使用してプロシージャを見つけてブロックしましたが、これは機能しますが、一部のサーバーではsys.dm_exec_sql_text(sql_handle)を実行する権限がないため、最適ではないと思います。 これを行うための最良の方法は何ですか?

4
オブジェクト名の引用符を外すためのMS-SQLの(非表示の)組み込み関数はありますか?
オブジェクト名(識別子)を一部のデータベース、たとえば一部のパラメーターテーブルに保存することがあります。'='または 'LIKE'比較演算子を使用してこれらのテーブルからレコードを選択するため、これらの名前を常に角かっこ付きまたは角括弧なしで保存するように注意する必要があります。 IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]'; または IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME'; ただし、MS-SQLには、OBJECT_ID()関数など、角括弧の有無にかかわらずオブジェクト名を使用できるいくつかの関数があります。私はdbfiddle.ukに最小限の例を設定しました。 CREATE TABLE TEST ( ID INT IDENTITY(1,1) PRIMARY KEY, OBJECT sysname NOT NULL ); GO INSERT INTO TEST VALUES ('[obj1]'),('obj2'),('obj3'),('[obj4]'); GO これで、OBJECT_ID()を使用して、テーブルTESTが次のように存在するかどうかを確認できます。 IF OBJECT_ID('TEST') IS NOT …
12 sql-server  t-sql 

2
ストアドプロシージャでのトランザクション
単一のトランザクションでUPDATEとINSERTを実行する必要があります。そのコードはそれ自体で問題なく機能しますが、簡単に呼び出して必要なパラメーターを渡すことができるようにしたいと思います。このトランザクションをストアドプロシージャにネストしようとすると、多くの構文エラーが発生します。 次のコードをカプセル化して簡単に呼び出せるようにするにはどうすればよいですか? BEGIN TRANSACTION AssignUserToTicket GO DECLARE @updateAuthor varchar(100) DECLARE @assignedUser varchar(100) DECLARE @ticketID bigint SET @updateAuthor = 'user1' SET @assignedUser = 'user2' SET @ticketID = 123456 UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID); INSERT INTO [dbo].[tblTicketUpdate] ([ticketID] ,[updateDetail] ,[updateDateTime] ,[userSamAccountName] ,[activity]) VALUES (@ticketID, 'Assigned ticket to …

3
時間間隔に基づくレコードのグループ化
次のスキーマのテーブルがあり、時間間隔(例:1分あたりのレコード数)に基づいてデータをグループ化できるクエリを定義し、前のグループ以降のSnapShotValueへの変更の合計を提供する必要があります。現時点では、SnapShotValueは常に増分するため、差分の合計のみが必要です。誰かがこれを行う可能性のあるSQL Server T-SQLクエリを手伝ってくれる?私はスキーマを変更することにオープンですが、これは私が現在持っているものです。 スキーマ CaptureTime (datetime) SnapShotValue (int) サンプルデータ 1 Jan 2012 00:00:00, 100 1 Jan 2012 00:00:30, 125 1 Jan 2012 00:01:00, 200 1 Jan 2012 00:01:30, 300 1 Jan 2012 00:02:15, 400 1 Jan 2012 00:02:30, 425 1 Jan 2012 00:02:59, 500 必要なクエリ結果 1 Jan 2012 00:01:00, 225 …

1
ストアドプロシージャの結果をテーブル変数に挿入する
テーブル変数に値を格納するストアドプロシージャがあります。これらの値を選択し、プロシージャが呼び出されたときにそれらを返します。 これらの戻り値を別のテーブル変数に設定しようとしていますが、わかりません。 ストアドプロシージャ ALTER PROCEDURE [dbo].[GetOrSetDomainId] @DomainName varchar(50), @DomainUrl varchar(50) AS BEGIN DECLARE @DomainId bigint; DECLARE @NumberOfRwos bigint; DECLARE @DomainHistory TABLE ( DomainId bigint, HasHistory bit, ServerOnline bit, DatabaseOnline bit, ServerPerformance bigint, DatabasePerformance bigint, SoldTickets bigint ) SELECT @NumberOfRwos = COUNT(Id) FROM DomainData WHERE DomainName = @DomainName OR DomainUrl = …

2
T-SQL(SSMSではない)を使用してデータベースにログインをマップする方法
すべてのアクセス許可とすべてをコードに割り当てる必要があるプログラムを書いています。私はこの部分で立ち往生しています: msdbデータベースの[マップ]の下にある小さなボックスをクリックし、そのユーザーをSqlAgentUserロールに割り当てるのと同じことをしたいだけです。SQL Serverエージェントジョブを追加/編集できるユーザーが必要です。SSMSを使用して設定を正しく取得できますが、生のSQLでそれを実行する方法を理解することができません。 ALTER LOGINを調べましたが、必要なことを実行するものは何も見つかりません。私はGoogleに対する正しい用語を知らないだけだと思います。私は通常、このようなことはしません。 どんな助けでも大歓迎です!

4
ジョブ、スケジュール、および次のスケジュールされた実行日時のリスト
ジョブ、スケジュール、および次のスケジュールされた実行日時のリスト ジョブ、スケジュール、次のスケジュールされた実行日時を一覧表示しようとしています。しかし、私は成功しているようには見えません。 sysjobactivity next_scheduled_run_dateがありますが、これは必要ですが、ジョブとスケジュールの両方に接続することはできません。 以外の方法がある場合は、そこにsysjobactivity案内してください。 SELECT sj.name AS jobName , ss.name AS scheduleName , sja.next_scheduled_run_date FROM msdb.dbo.sysjobs sj INNER JOIN msdb.dbo.sysjobactivity sja ON sja.job_id = sj.job_id INNER JOIN msdb.dbo.sysjobschedules sjs ON sjs.job_id = sja.job_id INNER JOIN msdb.dbo.sysschedules ss ON ss.schedule_id = sjs.schedule_id WHERE (sj.name LIKE 'xray%') AND (sja.next_scheduled_run_date > GETDATE())

3
小数点記号としてコンマを使用した文字列数値をNUMERIC(10、2)に変換します
私はギリシャ語でフォーマットされた数値を含むvarchar列のSQLテーブルを持っています(千の区切り文字として。そして小数点の区切り文字としてコンマ) 古典的な変換 CONVERT(numeric(10,2),REPLACE([value],',','.')) ので機能しません。(千区切り)変換を強制終了します たとえば試してください CONVERT(numeric(10,2),REPLACE('7.000,45',',','.')) そのような値をnumeric(10,2)に変換したい それを処理する方法の提案はありますか?

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