約 3,531,740 件
https://w.atwiki.jp/dotcom/pages/405.html
Javaお勉強のためにMicrosoftのSQLServerを使うことになりました。 というわけでSQLServerについてかきますです。 無償大好きなので2005 Express Editionを使います。 2008って出てるのですね。でも2005使います。。 SQLServerについての最初の記事 SQLServerはじめました? 「SQLServer」を含む記事 SQLServerタグ SQLServerを含む記事一覧 SQLServer記事 date型のMAX値って? 数字の羅列の日付をフォーマット変換したいの
https://w.atwiki.jp/setechdiv/pages/62.html
SysObject SQLServerがシステムとして持っているテーブル(DB単位)。 テーブル名、ビュー名、主キー名など、様々な情報を持っている。 それらの項目が混在するため、xTypeを指定することで目的の項目を絞り込む。 ex U(テーブル名) PK(主キー名) V(ビュー名) Accessでいうと、"MSysObject"がこれに当たるらしい。。。 SQLServerではUpdate文に外部結合は使えない? これでいけるじゃん from句で外部結合しようと、 SELECT T1.AAA, T2.BBB, T3.CCC FROM T1,T2,T3 WHERE T1.XX *= T3.XX ・・・ みたいに書いたら、サーバ様にしかられた。 曰く、 クエリで ANSI 以外の外部結合演算子 ("*=" または "=*") が使用されています。 このクエリを変更せずに実行するには、ストアド プロシージャ sp_dbcmptlevel を使用して、 現在のデータベースの互換性レベルを 80 以下に設定してください。 ANSI 外部結合演算子 (LEFT OUTER JOIN、RIGHT OUTER JOIN) を使用して クエリを書き直すことをお勧めします。 今後のバージョンの SQL Server では、旧バージョンとの互換モードでも、 ANSI 以外の結合演算子はサポートされなくなる予定です。 だそうな。 そうなの…? 一昨年発行のリファレンスじゃもう古いのかい…? http //techbank.jp/Community/blogs/mymio/archive/2009/04/25/6665.aspx あと、SQLServerでは、先頭に半角数字の項目名はあまり推奨されない。 http //rfs.jp/sb/sql/02/01.html 勝手に数値と認識して項目名が計算に使われちゃったりするかららしい。 使いたい時は[]でくくること。 .
https://w.atwiki.jp/piyopico/pages/37.html
FrontPage ページ新規作成 Transact-SQL データベースメール 検索条件 監視 参考WEB http //sql-server-performance.com SSIS SQL Server 2005のSSIS自習書 http //msdn.microsoft.com/ja-jp/sqlserver/cc720684.aspx http //technet.microsoft.com/ja-jp/sqlserver/cc721623.aspx
https://w.atwiki.jp/chiffon/pages/24.html
MS SQLServerのmasterデータベースの復元 MicrosoftのSQLServerで、masterデータベースを復元する際には、 シングルユーザモードで起動しなくてはなりません。これは masterデータベースだけのようです。 コマンドでのやり方を書きます。 パスについては環境に合わせて下さい。 c \Program Files\Microsoft SQL Server\Binn\sqlservr -c -m c はコマンドプロンプトから起動 m はシングルユーザモードで起動 起動後にosql(osql -E)等から次のコマンドを発行します。 RESTORE DATABASE master FROM DISK = c \backup\master.bck go
https://w.atwiki.jp/tak_is/pages/16.html
Knowledge オブジェクト抽出SQLまとめ カラムの照合順序の確認 SQLServer2012ライセンス SQLServerのバージョン関連 bcpコマンド 指定フォルダのSQLをまとめて実行(バッチファイル) Transact-SQL プログラミング 複数行をカンマ区切りで集約する ##
https://w.atwiki.jp/leafsphere/pages/15.html
SQLServer ○Accessよりリンクする場合 ユーザーに以下の権限が必要 db_datawriter db_datareader db_owner(下位のユーザーでも可?) ○コマンドラインよりアタッチ sqlcmd -Sサーバー名\インスタンス名 -E -Q"CREATE DATABASE testdb ON (FILENAME= フルパス ) FOR ATTACH" ○物理ファイル名の変更方法 1)データベースの「バックアップ」を行う。 2)データベースの「デタッチ」を行う。 3)エクスプローラ等でデータ(.mdf/.ldf)をバックアップを取る。 4)データ(.mdf/.ldf)を削除する。 5)データベースの「復元」を行う。 6)「デバイスから」でバックアップしたファイル名(.bak)を指定する。 7)「復元元データベース」にオプションを変更する。 8)「復元先データベース」で元のデータベース名を選択する。(6の時点では存在しない) 9)「オプション」タブを開く。 10)「復元先」項目の内容を変更する。 11)「OK」ボタンで復元を開始する。 12)データベースプロパティでファイル名を確認する。 その他 Access-SQLServerデータ型の違い Edit
https://w.atwiki.jp/chaka-poko/pages/34.html
SQLServer 連番を振りなおす [Counter] Total: -
https://w.atwiki.jp/lmes2/pages/217.html
SQLServer 参考サイト Transact-SQL リファレンス
https://w.atwiki.jp/kogo/pages/9.html
SQLServerの便利機能 手軽なワークテーブルをつくる select * into #emp_tmp from emp "#"で始まる名前はワークテーブルとみなされる。 DBの接続が切れた時点で削除される。 Oracleにもあったらいいのに。
https://w.atwiki.jp/memo77/pages/22.html
PageLastUpdate 2017-08-08/today - /yesterday - クリックすると見出し一覧を表示します aname(Management Studio のインテリセンスに作成したオブジェクトを即反映させる セキュリティ接続時にWindowsのログインユーザーを返す関数 各ユーザーがどの固定サーバー ロールを持っているかを表形式で表示するSQL データベース オブジェクトの権限を見やすい形で取得する SQL Server 2008 Express Editionのインストール後、SQL Server Management Studioを立ち上げようとするとエラー レプリケート先のテーブルにupdateトリガを設定するときの注意 ログインアカウントの既定のデータベースを削除するとエンタープライズマネージャで接続できなくなる レプリケートしているテーブルでUPDATEトリガが動作しない 任意の文字列を含む列名を検索 TRUNCATE TABLE を行うには ALTER TABLE 権限が必要 Accessは所有者名に\を含むSQLServerのテーブルをリンクできない INSTEAD OFトリガ中でSELECTを書くとODBCが「カーソルの状態が正しくありません」とエラーを返す。 SQLServerの最大容量仕様 システムストアドプロシージャの結果をテーブルとして使用する。 文字をバイト数で切る検証してみた レプリケート対象のテーブルに対するトリガの設定 テーブルサイズの一覧を返すSQL ストアドプロシージャから任意のエラーを返す 値を返すストアドプロシージャ @@ERRORと@@ROWCOUNTを同時に使う SQLからスカラ値を取り出す 動的なSQLの戻り値を取得するユーザー定義関数を文字列で与えて結果を返せるか? CURSORの基本構文 実行権限があるストアドが実行できない CREATE TABLBEでNULL可/不可は常に明示したほうがよい よく使うサイト comment aname(Management Studio のインテリセンスに作成したオブジェクトを即反映させる} 2017/08/08 環境 SQL Server 2016 [メニュ]-[編集]-[IntelliSense]-[ローカルキャッシュの更新] 参考:Management Studio のクエリウィンドウで表示される赤い波線を消す方法 http //www.projectgroup.info/tips/SQLServer/MSSQL_00000012.html セキュリティ接続時にWindowsのログインユーザーを返す関数 2010/11/24 環境 SQL Server 2008 データベースを2008に移行したのをきっかけに、可能な限りセキュリティ接続に切り替えたので、せっかくだからきちんと取得するようにしてみた。 CREATE FUNCTION [dbo].[NT_USER_NAME]() RETURNS nvarchar(128) AS BEGIN DECLARE @nt_user_name nvarchar(128) SET @nt_user_name = SET @nt_user_name = (SELECT rtrim(CONVERT(nvarchar(128), nt_user_name)) FROM sys.dm_exec_sessions WHERE session_id = @@SPID); RETURN @nt_user_name END 各ユーザーがどの固定サーバー ロールを持っているかを表形式で表示するSQL 2009/11/03 環境 SQL Server 2000 システム監査に対応するために作ってみましたその2。 SELECT L.srvid ,S.srvname ,S.datasource ,S.catalog ,name ,password ,xstatus ,CASE WHEN xstatus 1 = 0 THEN ELSE ● END AS denylogin ,CASE WHEN xstatus 2 = 0 THEN ELSE ● END AS hasaccess ,CASE WHEN xstatus 4 = 0 THEN ELSE ● END AS isntname ,CASE WHEN xstatus 8 = 0 THEN ELSE ● END AS isntuser ,CASE WHEN xstatus 16 = 0 THEN ELSE ● END AS sysadmin ,CASE WHEN xstatus 32 = 0 THEN ELSE ● END AS securityadmin ,CASE WHEN xstatus 64 = 0 THEN ELSE ● END AS serveradmin ,CASE WHEN xstatus 128 = 0 THEN ELSE ● END AS setupadmin ,CASE WHEN xstatus 256 = 0 THEN ELSE ● END AS processadmin ,CASE WHEN xstatus 512 = 0 THEN ELSE ● END AS diskadmin ,CASE WHEN xstatus 1024 = 0 THEN ELSE ● END AS dbcreator FROM master.dbo.sysxlogins AS L LEFT OUTER JOIN master.dbo.sysservers AS S ON S.srvid = L.srvid 結果はこんな感じ。 srvid srvname datasource catalog name password xstatus denylogin hasaccess isntname isntuser sysadmin securityadmin serveradmin setupadmin processadmin diskadmin dbcreator MyDomain\Domain Users 0x 6 ● ● MyDomain\Domain Admins 0x 22 ● ● ● BUILTIN\Administrators 0x 22 ● ● ● SERVER_A\administrator 0x 28 ● ● ● AppConnection 0xhogehoge 2 ● sa 0xmogemoge 18 ● ● 0 SERVER_A SERVER_A 0x 224 ● ● ● 1 SERVER_B SERVER_B sa 0xhogemoge 64 ● データベース オブジェクトの権限を見やすい形で取得する 2009/10/30 環境 SQL Server 2000 システム監査に対応するために作ってみました。 エンタープライズ マネージャみたいにSELECT/INSERT/UPDATE/DELETE/EXECUTEをオブジェクト別、ユーザー/ロール別で横並びに取得します。 SELECTやUPDATEで列で権限が設定されている場合は縦に並びます。 (手抜きなのでSELECTとUPDATEの両方に列ごとの設定があると掛け算になっちゃうので注意。時間のあるときに修正予定。) ServerName DBName Grantee Owner Object ProtectType SELECT INSERT UPDATE DELETE EXECUTE MyServer MyDB ユーザー/ロール dbo テーブルA Grant (All+New) TRUE (All+New) TRUE MyServer MyDB ユーザー/ロール dbo テーブルB Grant (All+New) TRUE 列A TRUE MyServer MyDB ユーザー/ロール dbo テーブルB Grant (All+New) TRUE 列B TRUE MyServer MyDB ユーザー/ロール dbo ストアド Grant TRUE 表示される内容の詳細についてはsp_helprotectを確認してください。 sp_helprotectの「現在のデータベースしか使えない」という残念な仕様により、ストアド化して複数のDBの情報を一括で取得することはできませんでした。 まあクエリ アナライザからならUSEを使って複数DBを一気に取得するようにもできるんですが、まあたまにしか使わないからいいか、という感じで。 CREATE TABLE #sp_helprotect ( Owner sysname ,Object sysname ,Grantee sysname ,Grantor sysname ,ProtectType nvarchar(10) ,[Action] nvarchar(20) ,[COLUMN] nvarchar(128) ) INSERT INTO #sp_helprotect EXEC sp_helprotect @permissionarea= o SELECT @@Servername AS ServerName,db_name() AS DBName,PK.Grantee,PK.Owner,PK.Object,PK.ProtectType ,CASE WHEN S.Grantee IS NULL THEN ELSE S.[SELECT] END AS [SELECT] ,CASE WHEN I.Grantee IS NULL THEN ELSE TRUE END AS [INSERT] ,CASE WHEN U.Grantee IS NULL THEN ELSE U.[UPDATE] END AS [UPDATE] ,CASE WHEN D.Grantee IS NULL THEN ELSE TRUE END AS [DELETE] ,CASE WHEN E.Grantee IS NULL THEN ELSE TRUE END AS [EXECUTE] FROM ( SELECT Grantee,Owner,Object,ProtectType FROM #sp_helprotect GROUP BY Grantee,Owner,Object,ProtectType ) AS PK LEFT OUTER JOIN ( SELECT Grantee,Owner,Object,ProtectType,[COLUMN] AS [SELECT] FROM #sp_helprotect WHERE [Action] = SELECT ) AS S ON PK.Grantee=S.Grantee AND PK.Owner=S.Owner AND PK.Object=S.Object AND PK.ProtectType=S.ProtectType LEFT OUTER JOIN ( SELECT Grantee,Owner,Object,ProtectType FROM #sp_helprotect WHERE [Action] = INSERT ) AS I ON PK.Grantee=I.Grantee AND PK.Owner=I.Owner AND PK.Object=I.Object AND PK.ProtectType=I.ProtectType LEFT OUTER JOIN ( SELECT Grantee,Owner,Object,ProtectType,[COLUMN] AS [UPDATE] FROM #sp_helprotect WHERE [Action] = UPDATE ) AS U ON PK.Grantee=U.Grantee AND PK.Owner=U.Owner AND PK.Object=U.Object AND PK.ProtectType=U.ProtectType LEFT OUTER JOIN ( SELECT Grantee,Owner,Object,ProtectType FROM #sp_helprotect WHERE [Action] = DELETE ) AS D ON PK.Grantee=D.Grantee AND PK.Owner=D.Owner AND PK.Object=D.Object AND PK.ProtectType=D.ProtectType LEFT OUTER JOIN ( SELECT Grantee,Owner,Object,ProtectType FROM #sp_helprotect WHERE [Action] = EXECUTE ) AS E ON PK.Grantee=E.Grantee AND PK.Owner=E.Owner AND PK.Object=E.Object AND PK.ProtectType=E.ProtectType ORDER BY PK.Grantee,PK.Owner,PK.Object,PK.ProtectType DROP TABLE #sp_helprotect SQL Server 2008 Express Editionのインストール後、SQL Server Management Studioを立ち上げようとするとエラー 2009/10/20 ファイル C \WINDOWS\Microsoft.NET\Framework\ⶐ粕\mscorlib.tlb を読み込むことができませんでした。この状況を修復しようとしましたが、ファイルが見つからなかったため失敗しました。 とエラーが表示される。 最初化けているところもあわせて検索をかけたけど見つからなかったのでmscorlib.tlb以降で検索したら下記のKBがヒット。 http //support.microsoft.com/kb/918685/ja 2005なんだけどおそらく2008でも同じと判断。ただし Meaningless_string の部分は、エラー メッセージ中に表示される意味のない文字です。これらは、v1.0.3705、v1.1.4870、v2.0.50727 などの Microsoft .NET Framework のバージョン番号に類似する文字です。 ここがちょっと気になる。2008だと3.5かも。 ただ[%windir%\Microsoft.NET\Framework]以下を検索してもmscorlib.tlbは3.5の下にはないのでv2.0.50727でいいだろうと判断。 レジストリ値を[%windir%\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb]にしたらエラーは出なくなりました。 レプリケート先のテーブルにupdateトリガを設定するときの注意 2008/08/12 レプリケート対象のテーブルは、データの更新とレプリケートの更新で2回udpateが走るので、updateトリガを貼る場合はトリガの先頭に IF UPDATE (msrepl_tran_version) RETURN と入れるのが定石。 ところがテーブルA→Bと一方向のレプリケートをしたとき、テーブルBのupdateトリガが動かないことに気がついた。 レプリケートによる更新ではmsrepl_tran_versionもupdateされるようだ。 まあそもそも一方向のレプリケートなのにmsrepl_tran_versionがあるというのが問題なので、正しく運用していれば起こらないか。 ログインアカウントの既定のデータベースを削除するとエンタープライズマネージャで接続できなくなる 2008/05/16 検索語:使えない、つながらない 突然エンタープライズマネージャから特定のサーバーへのアクセスができなくなった。 他のアカウントだと問題はない。なんで?と思ったら、接続情報のログインに指定された「既定のデータベース」を削除していた。 既定のデータベースを存在するものに変更したら接続できるようになった。 特に検証せず修正してしまったけど、たぶん接続先データベースを指定して接続すれば問題ないんだろうな。 レプリケートしているテーブルでUPDATEトリガが動作しない 2008/05/12 検索語:アクセス、DAO、ADO、動かない、実行されない 別にバグでもなんでもないですが、落とし穴としてメモ。 「Accessから更新するとトリガが動いてない!」という報告を受けてリンクテーブルでテストしたけど・・・動いてる。 Accessからだと動かないって理由はないだろう・・・としばらく考えていて、トリガの先頭の IF UPDATE(msrepl_tran_version) RETURN 以外にありえないと気がついた。 ソースを見てみるとご丁寧にmsrepl_tran_versionも含めて全フィールドに値を書き込んでくれてます。 確かにレプリケート自体レアな仕様だから、まあ気がつかないかもね。 でも書き込む必要のないフィールドに値を入れるのはそもそも冗長なのでダメですね。 こういうのを開発チームに徹底するのって大変。 任意の文字列を含む列名を検索 2008/04/25 同じ列名のローマ字綴りがテーブルによってズレてるのを見つけてへこむ。 間違いやすい綴りについてチェックするために、列名検索を作成。 cyu→chuとかjyu→juとか、20個近くありましたorz SELECT sysobjects.name AS TableName , syscolumns.name AS ColumnName FROM syscolumns INNER JOIN sysobjects ON sysobjects.id=syscolumns.id WHERE sysobjects.xtype = U AND syscolumns.name LIKE %tyo% TRUNCATE TABLE を行うには ALTER TABLE 権限が必要 2008/04/25 ユーザーが一時使用するテーブルに対してデータをDELETEではなくTRUNCATE TABLEで消したいとする。 (多量のデータを一括して消したいとき、TRUNCATE TABLEはDELETEより効率がよい。) このときテーブルにDELETE権限を与えても、ストアドなどにEXECUTE権限を与えてTRUNCATE TABLEしようとしても成功しない。 テーブルをユーザーの所有にすればTRUNCATE TABLEが使えるようになる。 Accessは所有者名に\を含むSQLServerのテーブルをリンクできない 2008/04/25 SQLServerはユーザー名に\を含めることができる。 例えば別ドメインのユーザーとしてDomainName\UserNameのような表記があり得る。 しかしこのテーブルはAcesssからリンクできない。 INSTEAD OFトリガ中でSELECTを書くとODBCが「カーソルの状態が正しくありません」とエラーを返す。 2008/03/19 AccessからリンクしたテーブルにINSTEAD OFトリガを設定したが、テーブルを結合して更新をかけようとするとエラー。 特定条件に一致する件数のカウントのためにトリガの中でSELECTを書いたのが原因。 件数カウントは必須なので SELECT ... INTO #DUMMY FROM ... IF @@ROWCOUNT 0 BEGIN ... のようにしたら解決。えー。 SQLServerの最大容量仕様 2007/11/27 検索語:列名の長さ、仕様 検索をかけてみてぱっとひっかからなかった。 http //www.microsoft.com/japan/sql/prodinfo/previousversions/Specmax.mspx システムストアドプロシージャの結果をテーブルとして使用する。 2007/08/22 SQL Serverがロックしているときってエンタープライズマネージャからは蹴られることが多い。 システムストアドプロシージャのsp_lockとsp_whoを使えばいいんですが、プロセスがどのPCのものかを判断したいときに二つを見比べないといけません。 システムストアドプロシージャ同士が連結できないので、テーブルにできないかなと探したら、 http //blogs.wankuma.com/naka/archive/2004/03/07/1607.aspx ↑この記事を発見。 sp_lockとsp_whoを結合した結果を戻すストアドを作成してみました。 CREATE PROCEDURE [dbo].[Select_LockStates] AS CREATE TABLE #sp_lock ( spid nvarchar(64) ,dbid nvarchar(64) ,PbjID nvarchar(64) ,IndID nvarchar(64) ,TYPE nvarchar(64) ,Resource nvarchar(64) ,Mode nvarchar(64) ,STATUS nvarchar(64) ) INSERT INTO #sp_lock EXEC sp_lock CREATE TABLE #sp_who ( spid nvarchar(64) ,ecid nvarchar(64) ,STATUS nvarchar(64) ,loginname nvarchar(64) ,hostname nvarchar(64) ,blk nvarchar(64) ,dbname nvarchar(64) ,cmd nvarchar(64) ) INSERT INTO #sp_who EXEC sp_who SELECT * FROM #sp_who INNER JOIN #sp_lock ON #sp_who.spid=#sp_lock.spid GO 文字をバイト数で切る 2007/08/09 http //natchan.seesaa.net/article/943978.html LEFT CONVERT(VARCHAR(2), moji) RIGHT REVERSE(CONVERT(VARCHAR(4), REVERSE(moji))) 2バイト文字列が分割されるとどうなるのかなぁ。要検証。 検証してみた DECLARE @moji VARCHAR(30) DECLARE @one VARCHAR(1) DECLARE @three VARCHAR(3) SET @moji = 綺麗 SELECT @one = CONVERT(VARCHAR(1), @moji) SELECT @three = CONVERT(VARCHAR(3), @moji) SELECT 基本文字列 AS TestCase , @moji AS String , DATALENGTH(CONVERT(VARCHAR(30), @moji)) AS Byte UNION SELECT 左から1バイト取得 ,@one,datalength(@one) UNION SELECT 左から3バイト取得 ,@three,datalength(@three) 文字の途中で切れることもなく、綺麗にとってくれます。 TestCase String Byte 基本文字列 綺麗 4 左から1バイト取得 0 左から3バイト取得 綺 2 レプリケート対象のテーブルに対するトリガの設定 2007/06/12 レプリケート対象となったテーブルは、自分自身に対してmsrepl_tran_versionへのアップデートをかける。 したがって、トリガを作成する場合は if update (msrepl_tran_version) return を入れないと、トリガが複数回起動されるので注意。 ただし、INSTEAD OF トリガに関してはこの行は不要。 逆に設定すると動作しなくなるので注意。 テーブルサイズの一覧を返すSQL 2007/06/07 CREATE TABLE #temp ( TABLE_NAME sysname, ROWS sysname, reserved sysname, DATA VARCHAR(32), index_size VARCHAR(254), unused VARCHAR(100) ) INSERT INTO #temp EXEC sp_MSforeachtable @command1 = "sp_spaceused ? " SELECT * FROM #temp ORDER BY TABLE_NAME ここで使われている sp_MSforeachtable はヘルプに乗っていない。 「アンドキュメンテッド ストアドプロシージャ」で検索をかけるといろいろ出てきます。 他には sp_MSforeachdb とか便利そう。 別回:件数だけならこれでもいい SELECT o.name, i.rows FROM sysindexes AS i, sysobjects AS o WHERE o.xtype = U AND o.id = i.id AND i.indid 2; ストアドプロシージャから任意のエラーを返す まあ一番シンプルに書くとこんな感じ。引数はこれ以上は省略できない。 RAISERROR ( ここにメッセージ ,0,1) RETURN 値を返すストアドプロシージャ 2007/05/22 --こんな風に定義して CREATE PROCEDURE [dbo].[GetNextID] (@KEY INT,@NEXTID INT OUTPUT) AS UPDATE T_COUNTER SET F_ID = F_ID +1 WHERE F_KEY = @KEY SELECT @NEXTID = F_ID FROM T_COUNTER WHERE F_KEY = @KEY --こんな風に使う。 DECLARE @NEXTID INT EXEC dbo.GetNextID 22,@NEXTID OUTPUT PRINT @NEXTID レコードに対する処理をしない場合はユーザー定義関数のほうが適切。 @@ERRORと@@ROWCOUNTを同時に使う 2007/05/18 検索語:うまくいかない/値がとれない どちらも間にIFとかPRINTを挟むとクリアされてしまうので注意。 BEGIN TRANSACTION DECLARE @RC INT DECLARE @ERR INT UPDATE ... SELECT @RC=@@ROWCOUNT,@ERR=@@ERROR --必ず実行した直後に IF @ERR 0 BEGIN ROLLBACK TRANSACTION RETURN @ERR END IF @RC=0 BEGIN INSERT ... SELECT @RC=@@ROWCOUNT,@ERR=@@ERROR --必ず実行した直後に IF @ERR 0 BEGIN ROLLBACK TRANSACTION RETURN @ERR END END COMMIT TRANSACTION SQLからスカラ値を取り出す DECLARE @RESULT INT SELECT @RESULT = myField FROM myTable PRINT @RESULT のようにして取り出せる。複数レコードだとどうなるんだろう。あとでテストしよう。 動的なSQLの戻り値を取得する DECLARE @RESULT nvarchar(1024) EXECUTE sp_executesql N SELECT @Result = ... , N @Result nvarchar(1024) OUTPUT , @RESULT OUTPUT PRINT @RESULT ユーザー定義関数を文字列で与えて結果を返せるか? 上のsp_executeを利用して、fn_getresult( FunctionName )みたいに、ユーザー定義関数を文字で指定して結果を返すユーザー定義関数がつくれるかもと思ったけど、ユーザー定義関数の中でsp_executeがそもそも利用できませんでした。 もしできるなら誰か教えてください。 CURSORの基本構文 DECLARE myCursor CURSOR FOR SELECT myField FROM myTable OPEN myCursor FETCH NEXT FROM myCursor --← これを知らなくてハマった。@@FETCH_STATUSはOPEN直後が0であるとは限らないので、かならず1回実行してからLOOPに入ること。 WHILE @@FETCH_STATUS = 0 BEGIN --処理 FETCH NEXT FROM myCursor END CLOSE myCursor DEALLOCATE myCursor 実行権限があるストアドが実行できない 2007/05/02 ストアドの中でExec(SQL文)とした場合、SQL文の中にSELECT権限のないテーブルが含まれるとコケる。 平文で書いた場合はストアドの実行権限があればよい。どうせいと。 http //fukkey.dyndns.org/pins/sqls/020121/16348.html 所有権の継承の使用 EXECUTE ...権限 ストアド プロシージャの EXECUTE 権限は、特に指定のない限りストアド プロシージャの所有者に与えられます。EXECUTE 文字列内でステートメントを使用する権限は、そのステートメントがストアド プロシージャ内に含まれている場合でも、EXECUTE の実行直前にチェックされます。文字列を実行するストアド プロシージャが実行されるとき、権限は、プロシージャを作成したユーザーのコンテキストではなく、プロシージャを実行しているユーザーのコンテキストでチェックされます。しかし、ユーザーが 2 つのストアド プロシージャを所有しており、最初のプロシージャが 2 番目のプロシージャを呼び出すような場合、2 番目のストアド プロシージャに対して EXECUTE 権限がチェックされることはありません。 CREATE TABLBEでNULL可/不可は常に明示したほうがよい 2007/05/16 トリガ中のCREATEA TABLEで「NULL可」を明示的に指定しなかったことでエラー。 規定ではNULL可で作成されるはずだが、明示したほうがよい。 よく使うサイト 2007/04/25 pin s Laboratory http //www7.big.or.jp/~pinball/discus/sqls/index.html 2007/04/27 SQLを速くするぞ―お手軽パフォーマンス・チューニング http //www.geocities.jp/mickindex/database/db_optimize.html comment このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。 名前 コメント すべてのコメントを見る