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

実行時に文字列連結演算を使用してクエリを作成し、その文字列からクエリを実行します。

4
TSQLでテーブル作成スクリプトを生成する方法はありますか?
T-SQLのみで既存のテーブルから作成スクリプトを生成する方法はありますか(T-SQLはSMOにアクセスできないため、SMOを使用しません)。テーブル名を受け取り、指定されたテーブルの作成スクリプトを含む文字列を返すストアドプロシージャがあるとしますか? これにアプローチする別の方法があるかもしれないので、今私が直面している状況を説明させてください。数十のデータベースを持つインスタンスがあります。これらのデータベースはすべて同じスキーマ、すべて同じテーブル、インデックスなどを持っています。これらは、サードパーティのソフトウェアインストールの一部として作成されました。アドホックな方法でデータを集約できるように、それらを操作する方法が必要です。dba.seの素敵な人々がここですでに私を助けてくれました別のデータベースにトリガーを作成する方法は? 現在、すべてのデータベースのテーブルから選択を行う方法を見つける必要があります。という名前のテーブルにすべてのデータベース名を記録し、Databaseesそれらすべてに対してselectステートメントを実行する次のスクリプトを作成しました。 IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp select * into #tmp from Database1.dbo.Table1 where 1=0 DECLARE @statement nvarchar(max) = N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1' DECLARE @LastDatabaseID INT SET @LastDatabaseID = 0 DECLARE @DatabaseNameToHandle varchar(60) DECLARE @DatabaseIDToHandle int SELECT TOP …

3
SQLクエリコードの繰り返しを防ぐために、文字列を連結したり、手続きを行ったりする代わりになりますか?
免責事項:データベースを使用する作業時間のごく一部としてのみ、私と一緒に我慢してください。(ほとんどの場合、仕事でC ++プログラミングを行いますが、奇数月ごとにOracleデータベースで何かを検索/修正/追加する必要があります。) アドホッククエリとアプリケーションに組み込まれたクエリの両方で、クエリの大部分が「コード」を繰り返しただけの複雑なSQLクエリを繰り返し書く必要がありました。 伝統的なプログラミング言語で、そのような憎むべきを書く深いトラブルにあなたを得るでしょう、まだI(Iは)まだSQLクエリコードの繰り返しを防ぐために、まともな手法を見つけることができませんでした。 編集:最初に、元の例に優れた改善を提供してくれた回答者に感謝します。ただし、この質問は私の例に関するものではありません。SQLクエリの反復性についてです。そのため、これまでの回答(JackP、Leigh)は、より良いクエリを作成することで反復性を減らすことができることを示す素晴らしい仕事をしています。ただし、その場合でも、明らかに削除できない反復性に直面します。これは、常にSQLに悩まされます。「従来の」プログラミング言語では、コードの反復性を最小限に抑えるためにかなり多くのリファクタリングを行うことができますが、SQLでは、これを可能にする(?)ツールはないようです。 Oracleタグを再度削除したことに注意してください。これは、データベースやスクリプト言語が存在しないかどうかに興味があるためです。 今日私が一緒に石畳を作ったそのような宝石の一つです。基本的に、単一のテーブルの列セットの違いを報告します。次のコードをざっと読んでください。最後に大きなクエリ。以下に続きます。 -- -- Create Table to test queries -- CREATE TABLE TEST_ATTRIBS ( id NUMBER PRIMARY KEY, name VARCHAR2(300) UNIQUE, attr1 VARCHAR2(2000), attr2 VARCHAR2(2000), attr3 INTEGER, attr4 NUMBER, attr5 VARCHAR2(2000) ); -- -- insert some test data -- insert into TEST_ATTRIBS values ( 1, …

2
ストアドプロシージャ内のこのクエリでSQLインジェクションが発生しないのはなぜですか?
次のストアドプロシージャを作成しました。 ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100)) AS SELECT ActorDOB, ActorName FROM tblActor WHERE ActorName LIKE '%' + @nameString + '%' AND ActorGender = @actorgender 今、私はこのようなことをしてみました。私はこれを間違っているかもしれませんが、そのような手順がSQLインジェクションを防ぐことができることを確認したいです: EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor' 以下の画像は、上記のSQLがSSMSで実行され、エラーではなく結果が正しく表示されることを示しています。 ところで、クエリの実行が完了した後、セミコロンの後にその部分を追加しました。その後、再度実行しましたが、テーブルtblActorが存在するかどうかを確認したところ、まだそこにありました。私は何か間違っていますか?または、これは本当に注射防止ですか?私がここで尋ねようとしているのは、このような安全なストアドプロシージャですか?ありがとうございました。

4
結果のテーブル定義が不明なピボットCROSS JOINを生成するにはどうすればよいですか?
名前と値を持つ未定義の行数を持つ2つのテーブルがある場合、CROSS JOINそれらの値に対して関数のピボットをどのように表示しますか。 CREATE TEMP TABLE foo AS SELECT x::text AS name, x::int FROM generate_series(1,10) AS t(x); CREATE TEMP TABLE bar AS SELECT x::text AS name, x::int FROM generate_series(1,5) AS t(x); たとえば、その関数が乗算である場合、以下のような(乗算)テーブルをどのように生成しますか? これらの(arg1,arg2,result)行はすべて、次を使用して生成できます。 SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result FROM foo CROSS JOIN bar; したがって、これは表示の問題にすぎません。これは、カスタム名(CASTテキストへの単なる引数ではなくテーブルに設定された名前) CREATE TEMP …

2
動的SQLを使用して指定されたデータベースにビューを作成しますか?
別のデータベースにビューをドロップして作成するための動的SQLを作成しています。 だから私は書いた: set @CreateViewStatement = ' USE ['+ @DB +']; CREATE VIEW [dbo].[MyTable] AS SELECT ........something exec (@CreateViewStatement) それは私にエラーを与えます: 「CREATE VIEW」は、クエリバッチの最初のステートメントである必要があります。 USE DATABASEステートメントを削除すると正常に機能しますが、データベースは指定されなくなります。 この問題を解決するにはどうすればよいですか?

1
ユーザー共有クエリ:動的SQLとSQLCMD
foo.sqlDB技術サポートのチームが共有する多数のクエリをリファクタリングして文書化する必要があります(顧客の構成など)。各顧客が独自のサーバーとデータベースを持っている場合に定期的に来るチケットの種類がありますが、それ以外はスキーマは全面的に同じです。 現時点では、ストアドプロシージャはオプションではありません。私は動的またはSQLCMDのどちらを使用するかを議論しています。SQLServerを少し使い始めたばかりなので、どちらもあまり使用していません。 SQLCMDスクリプティング私は間違いなく「見た目」がきれいで、必要に応じてクエリを読みやすく、小さな変更を加えやすいと感じていますが、ユーザーにSQLCMDモードを強制的に有効にします。文字列操作を使用して記述されたクエリにより、構文の強調表示が失われるため、動的はより困難になります。 これらは、Management Studio 2012、SQLバージョン2008R2を使用して編集および実行されています。どちらの方法の長所/短所、またはいずれかの方法でのSQL Serverの「ベストプラクティス」の一部は何ですか?それらの1つは他よりも「安全」ですか? 動的な例: declare @ServerName varchar(50) = 'REDACTED'; declare @DatabaseName varchar(50) = 'REDACTED'; declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594'; declare @sql_OrderCheckQuery varchar(max) = (' use {@DatabaseName}; select -- stuff from {@ServerName}.{@DatabaseName}.[dbo].[client_orders] as "Order" inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders] as "VendOrder" on "Order".o_id = "VendOrder".vco_oid where "VendOrder".vco_oid …

4
ストアドプロシージャで動的SQLを使用したくないのはなぜですか?
動的SQLを使用したくないと言った人がいました。具体的な例や実際の例を挙げていただけますか?個人的には、データベースに数回コーディングします。柔軟性があるので大丈夫だと思います。私の推測では、SQLインジェクションまたはパフォーマンスについてです。他に何か?

2
TSQLを使用してデータベースを動的に変更する方法
SSMSのコンテキストを動的SQLで指定されたデータベースに動的に変更しようとすると問題が発生します。 EXEC sys.sp_executesql N'USE db1 ' ; 正常に実行されますが、SSMSのデータベースコンテキストは変更されません。 上記のように少し変更してみました DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50) SET @db = N'db1' SET @sql = N'Use ' + @db EXEC sp_executesql @sql 繰り返しになりますが、正常に実行されますが、データベースは変更されません。

2
sp_executesqlをデフォルトで設定/使用できますか?
SQL Serverに対して非常に動的なSQLクエリを使用するアプリケーションを探しています。非常に奇妙で複雑な方法で作成されたクエリを見て、それは別の話ですが、私が自分で物事を見つけることができない(あまりにも愚かすぎる)ことの正当な理由を与えるように言います...わかりませんクエリがでラップされているコードsp_executesql。 しかし、トレースすると、多数のクエリがでラップされて表示されsp_executesqlます。アプリケーションソリューション全体には、コマンドもまったく含まれていませんsp_executesql。 だから、デフォルトでsp_executesqlを使用してクエリをラップするようソフトウェアに強制する、まだ知らない種類の構成があるのか​​どうか疑問に思いました。 何がこの動作を引き起こす可能性がありますか?

1
動的に作成されたテーブルデータを返すストアドプロシージャ
簡単に言えば、調査システムを備えた外部ベンダーと協力しています。システムは、新しい調査を作成し、システムが新しいテーブルを作成するときに、必ずしも次のように設計されているとは限りません。 Tables ____ Library_1 -- table for Survey 1 SurveyId int InstanceId int Q_1 varchar(50) Library_2 -- table for Survey 2 SurveyId int InstanceId int Q_2 int Q_3 int Q_4 varchar(255) テーブルはで生成されたSurveyId名前の末尾に(Library_)と質問の列がで生成されQuestionId、それの終わり(でQ_)。 明確にするために、質問は別のテーブルに格納されているため、質問IDは連続していますが、各調査で1から開始されません。質問の列は、テーブルで割り当てられたIDに基づいています。 別のシステムに送信するためにすべての調査テーブルからデータを抽出する必要があることを除いて、クエリを実行するのに十分簡単なようです。これは問題が発生する場所です。新しい調査がフロントによって追加されると、テーブルが自動的に作成されるため、アプリケーションを終了すると、他のシステムはこのタイプの構造を処理できません。彼らは消費するためにデータが一貫している必要があります。 そのため、すべてのSurveyテーブルからデータを抽出して次の形式で配置するストアドプロシージャを作成する必要がありました。 SurveyId InstanceId QNumber Response ________ __________ _______ ________ 1 1 1 great 1 2 1 …

2
列を動的にエイリアスするにはどうすればよいですか?
可変名の列が20あるテーブル(私が設計したものではない)があります。つまり、表示しているレコードのタイプに応じて、該当する列の名前が変わる可能性があります。 可能な列名は別のテーブルに格納されているため、非常に簡単にクエリできます。 したがって、私が本当に探しているクエリは次のようになります。 SELECT Col1 AS (SELECT ColName FROM Names WHERE ColNum = 1 and Type = @Type), Col2 AS (SELECT ColName FROM Names WHERE ColNum = 2 and Type = @Type) FROM Tbl1 WHERE Type = @Type 明らかにそれはうまくいかないので、どうすれば同様の結果を得ることができますか? ' クエリ文字列を作成してEXECUTEing しようとしましたが、「Command(s)Completed Successfully」が返され、行セットが返されないようです。 不正なクエリを使用して動的SQLを作成していたため、空の文字列が作成されたことがわかりました。SQL Serverは空の文字列を正しく実行しました。 列名を単にハードコーディングするのではなく、これを実行する必要がある理由は、列名がユーザーが構成できるためです。

1
sp_executeは、タイプ 'int'のパラメータ '@handle'を予期しています
宛先データベースにテーブルが存在するかどうかをストアドプロシージャでチェックインしようとしています。そうでない場合は、ソースデータベースのinformation_schemaテーブルを使用してテーブルを作成します。しかし、sp_executeを使用して、テーブルが存在する場合に返してみると、エラープロシージャで型 'int'のパラメーター '@handle'が予期されます。 @handleパラメータを使用していません。誰かがこのエラーの意味を教えてもらえますか?なぜ私がそれを受け取っているのですか?私のコードの関連部分は以下です。 DECLARE @SQL NVARCHAR(MAX), @Parameters NVARCHAR(4000), @TableNotExists INT, @SourceTable NVARCHAR(200), @DestDB NVARCHAR(200) BEGIN SET @SourceTable = 'table' SET @DestDB = 'database' SET @Parameters = N'@SourceTableIN NVARCHAR(200), @TableNotExistsOut INT OUTPUT' SET @SQL = N'USE [' + @DestDB + '] IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE …

1
動的SQLのパラメーターの印刷
私は多くのタスクで動的SQLを使用しており、同じ問題に継続的に遭遇しました:動的T-SQLステートメント内で使用される変数の値を出力します。 例えば: Declare @SQL nvarchar(max), @Params nvarchar(max), @DebugMode bit, @Foobar int select @DebugMode=1,@Foobar=364556423 set @SQL='Select @Foobar' set @Params=N'@Foobar int' if @DebugMode=1 print @SQL exec sp_executeSQL @SQL,@Params ,@Foobar=@Foobar 上記のコードの印刷結果は、単に "Select @Foobar"です。実行中のSQLの値と変数名を動的に出力する方法はありますか?または、印刷を行うときに、SQLを再実行できるようにパラメーターを実際の値に置き換えますか? 同様のことを行うために関数を1つまたは2つ作成しましたが、データ型変換、パターンマッチングの切り捨ての問題、非動的な解決策を試しました。他の開発者がすべての変数を手動で印刷せずにこの問題を解決する方法に興味があります。

1
sp_prepexec(sp_execute)とsp_executeSQL
質問の要点:実際のストアドプロシージャは、一時テーブルキャッシュを実装する唯一のメカニズムですか、それともsp_executeSQL/ などのシステムストアドプロシージャsp_executeもそれらを利用しますか? 私はDBAではないので、少しだけ言葉を使ってください。私たちのアプリケーションは、プロファイラーから、sp_prepexec実行sp_prepareとの両方のシステムプロシージャであるすべてのSQLを実行する準備済みステートメントを送信しますsp_execute。私がやろうとしているのは、一時テーブルのキャッシュから利益を得ているかどうかを判断することです。 このガイドをobject_id()と一緒に使用して動作を調べています https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html 次に、このブログ投稿のポイント3は、EXECは一時テーブルキャッシュを使用できないことを示していますが、sp_executeSQLができるかどうかは省略しています:http : //blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx クライアント経由で送信されたクエリでは、単純な一時テーブルを作成しました。 DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement SELECT 1 AS id INTO #tmp SELECT OBJECT_ID('tempdb..#tmp'); プロファイラーで、私は見ることができます: declare @p1 int set @p1=NULL exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1 SELECT 1 …

5
動的SQLを使用したデータベース間の切り替え
複数のデータベース間でさまざまなコマンドを実行するプロセスがありますが、動的SQLを使用して 'use @var'でDBを変更しても、実際にはデータベースは変更されません。 これを[test_db]で実行: declare @currentDB varchar(max) declare @sql varchar(max) set @currentDB = DB_NAME() set @sql = 'use [' + @currentDB +']' use master exec(@sql) select DB_NAME() [マスター]を現在のデータベース名として返します- use [test_db]動的ではなくコマンドとして入力すると、正しい名前が返されます。 これを実行してデータベースを正しく切り替える方法はありますか?

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