SSDTのスキーマ比較でトラブル。エラーの詳細は
「データベースに対する View Definition アクセス許可がないため、リバース エンジニアリング操作を続行できません。」
解決方法は
データベースの「セキュリティ」→「ログイン」で対象のアカウントで右クリック→「プロパティ」→「セキュリティ保護可能なリソース」で「定義の表示」に許可をチェック
(参考)
SSDTのスキーマ比較でトラブル。エラーの詳細は
「データベースに対する View Definition アクセス許可がないため、リバース エンジニアリング操作を続行できません。」
解決方法は
データベースの「セキュリティ」→「ログイン」で対象のアカウントで右クリック→「プロパティ」→「セキュリティ保護可能なリソース」で「定義の表示」に許可をチェック
など色々と方法は考えられるかと思いますが、そのうちの一例「SQL Server から accdb にリンクサーバーで接続し、データを出力する方法」をメモしておきます。
構成
初めに空のaccdbファイルを作成して必要な場所に配置しておくと良いです。ACCESSのインストールされていない環境でもaccdbファイルを作成することが出来るようですが、詳細は検索してください。
64bit SQL Server からACCESS accdbファイルに接続するには 64bit 版の Microsoft.ACE.OLEDB が必要です。未インストールの場合は以下から入手できます。(ただし、64bit版と32bit版の共存にはトラブルがあるようで、既に32bit版Officeの入っていた私の開発環境ではACCESSが起動しなくなってしまいました。)
Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント
https://www.microsoft.com/ja-JP/download/details.aspx?id=54920
インストールに成功するとSSMSのサーバーオブジェクト→リンクサーバー→プロバイダーから確認できます。
EXEC ('CREATE TABLE Sample (
Id INTEGER NOT NULL,
Name TEXT(50) NOT NULL,
Email TEXT(50)
)') AT [LINKSERVERNAME];
表題のSQLサーバからACCESS accdbにデータを出力するためのクエリを作成しますが、ラクをするために事前に出力先のテーブルをSSMSのエクスポートウィザードで作成しておきます。もちろんCREATE文を書いて対応するテーブルを作成してもかまいません。
以下のストアドプロシージャを作成します。
USE [SampleDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE spExportFromSQLtoACCDB
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM [LINKSERVERNAME]...[Sample];
INSERT INTO [LINKSERVERNAME]...[Sample] SELECT * FROM SampleDB.dbo.Sample
END
GO
このストアドプロシージャを実行すれば SQL Server から accdb へのデータのエクスポートが実行できますが、アプリケーションから実行するにはパーミッションの設定が必要です。 今回の場合は ASP.NET から実行する形でしたので、IISの当該アプリケーションプールIDにaccdb ファイルへの変更権限を付与します。 アプリケーションプールIDはファイルの権限設定ウィンドウに出てこないので「IIS AppPool\DefaultAppPool」のような形で追加します。
以上メモまで。
"INSERT INTO TABLE (NAME) VALUES ('test'); SELECT SCOPE_IDENTITY() AS ID;"
ADODB.Recordset エラー '800a0cc1'
"SET NOCOUNT ON;INSERT INTO TABLE (NAME) VALUES ('test'); SELECT SCOPE_IDENTITY() AS ID;"
DECLARE @d datetime
set @d = CONVERT(datetime, '2014-07-01')
/* DATENAME */
select DATENAME(yyyy, @d ) -- 2014
select DATENAME(yy, @d ) -- 2014
select DATENAME(m, @d ) -- 07
select DATENAME(mm, @d ) -- 07
select DATENAME(d, @d ) -- 1
select DATENAME(dd, @d ) -- 1
select DATENAME(m, @d) + right('0' + DATENAME(d, @d), 2) -- 0701
/* CONVERT */
select CONVERT(nvarchar(10),@d,12) -- 140701
select CONVERT(nvarchar(10),@d,112) -- 20140701
select CONVERT(nvarchar(10),@d,111) -- 2014/07/01
select right(CONVERT(nvarchar(10),@d,12),4) -- 0701
/* FORMAT */
select FORMAT(@d,'M') -- 7月1日
select FORMAT(@d,'MM') -- 07
select FORMAT(@d,'MMM') -- 7
select FORMAT(@d,'MMMM') -- 7月
select FORMAT(@d,'d') -- 2014/07/01
select FORMAT(@d,'dd') -- 01
select FORMAT(@d,'ddd') -- 火
select FORMAT(@d,'dddd') -- 火曜日
select FORMAT(@d,'MMdd') -- 0701
Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.記事の中で
なお、本稿ではSQL Server Compact 4.0を前提としているので、プロバイダ名は「System.Data.SqlServerCe.4.0」としているが、従来のSQL Serverに接続するならば、「System.Data.SqlClient」とすればよい。とあったので、
<connectionStrings>
<add name="MyMvcContext"
connectionString="Data Source={servername};
Initial Catalog={dbname};
Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
-- To allow advanced options to be changed. EXEC sp_configure 'show advanced options', 1 GO -- To update the currently configured value for advanced options. RECONFIGURE GO -- To enable the feature. EXEC sp_configure 'xp_cmdshell', 1 GO -- To update the currently configured value for this feature. RECONFIGURE GO
構成オプション 'show advanced options' が 0 から 1 に変更されました。RECONFIGURE ステートメントを実行してインストールしてください。 構成オプション 'xp_cmdshell' が 0 から 1 に変更されました。RECONFIGURE ステートメントを実行してインストールしてください。
EXECUTE xp_cmdshell 'bcp AdventureWorks2008R2.Sales.Currency2 in Currency.dat -T -c' EXECUTE xp_cmdshell 'bcp "SELECT Name FROM AdventureWorks2008R2.Sales.Currency" queryout Currency.Name.dat -T -c'
/月毎/ SELECT YEAR(日付) AS 年, MONTH(日付) AS 月, COUNT(*) AS 計数 FROM TABLE GROUP BY YEAR(日付), MONTH(日付)
/月毎/ SELECT CAST(YEAR(日付) AS VARCHAR) + '/' + CAST(MONTH(日付) AS VARCHAR) AS 年月, COUNT(*) AS 計数 FROM TABLE GROUP BY CAST(YEAR(日付) AS VARCHAR) + '/' + CAST(MONTH(日付) AS VARCHAR)
/日毎/ SELECT CONVERT(VARCHAR, 日付, 111) AS 年月日, COUNT(*) AS 計数 FROM TABLE GROUP BY CONVERT(VARCHAR, 日付, 111) /月毎/ SELECT SUBSTRING(CONVERT(VARCHAR, 日付, 111),1,7) AS 年月, COUNT(*) AS 計数 FROM TABLE GROUP BY SUBSTRING(CONVERT(VARCHAR, 日付, 111),1,7) AS 年月
製品番号 nvarchar(50) 商品名 nvarchar(50) 価格 int
1234-5678,フォーク,120 9876-5432,スプーン,100
BULK INSERT T_商品 FROM 'C:\インポートデータ1.csv' WITH ( DATAFILETYPE = 'char', FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' );データがタブ区切りの場合「FIELDTERMINATOR = '\t'」を指定します。
"1234-56789","おもちゃA 対象年齢2,3才",1200 "9876-54321","おもちゃB 付属品C,D",1000
<?xml version="1.0"?> <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RECORD> <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="""/> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="",""/> <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="","/> <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n"/> </RECORD> <ROW> <COLUMN SOURCE="2" NAME="number" xsi:type="SQLNVARCHAR"/> <COLUMN SOURCE="3" NAME="name" xsi:type="SQLNVARCHAR"/> <COLUMN SOURCE="4" NAME="price" xsi:type="SQLINT"/> </ROW> </BCPFORMAT><RECORD>に各<FIELD>をどこで区切るかを記述します。
BULK INSERT T_商品 FROM 'C:\インポートデータ2.csv' WITH (FORMATFILE='C:\フォーマットファイル.xml');
TRUNCATE TABLE T_商品;などと組み合わせてストアドプロシージャに記述し、ジョブに登録するなどして
SqlConnection con = new SqlConnection();
SqlCommand cmd
= new SqlCommand("INSERT INTO ...(略); SELECT SCOPE_IDENTITY();", con);
int i = (int)cmd.ExecuteScalar();
con.Close();
int i = (int)(decimal)cmd.ExecuteScalar();