2017-03-01 5 views
0

次のコードをSQLのストアドプロシージャとして使用していますが、@DBNAMEを受け入れていないため、宣言する必要があると宣言しています。ここで単純なSQL更新クエリをパラメータ化する

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE UpdateSQL 
-- Add the parameters for the stored procedure here 
@UpdateField varchar(25), 
@UpdateValue varchar(25), 
@FilterField varchar(25), 
@FilterValue varchar(25), 
@DBNAME sysname 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
UPDATE @DBNAME SET @UpdateField = @UpdateValue WHERE @FilterField = @FilterValue 
END 
GO 

は、SQLプロシージャを呼び出すC#の機能です:

internal static bool UpdateSql(SqlArgs pSqlArgs) 
{ 
    var pwd = GetPwd(); 
    var sqlCred = new SqlCredential(Sqluser, pwd); 

    var tCatalog = GetDbo(pSqlArgs.PCatalog); 

    var sqlConnection = new SqlConnection 
    { 
     ConnectionString = $"Data Source={SqlServer};Initial Catalog={tCatalog};", 
     Credential = sqlCred 
    }; 

    var sqlCommand = new SqlCommand 
    { 
     Connection = sqlConnection, 
     CommandText = "UpdateSQL", 
     Parameters = { new SqlParameter("@DB", pSqlArgs.PDbo), new SqlParameter("@UpdateField", pSqlArgs.PUpdateField), 
      new SqlParameter("@UpdateValue", pSqlArgs.PUpdateValue), new SqlParameter("@FilterField", pSqlArgs.PFilterField), 
      new SqlParameter("@FilterValue", pSqlArgs.PFilterValue) }, 
      CommandType = CommandType.StoredProcedure, 
    }; 


    try 
    { 
     sqlConnection.Open(); 

     return sqlCommand.ExecuteNonQuery().Equals(1); 
    } 
    catch (SqlException ex) 
    { 
     MessageBox.Show([email protected]"Error: {ex.Message}", @"Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     return false; 
    } 
    finally 
    { 
     sqlConnection.Close(); 
    } 
} 

私が実行しようとしている最終的な機能がある:USE @database UPDATE @TableのSET @UpdateField = @UpdateValue WHERE @ FilterField = @FilterValue

+0

だけでなく、あなたの手順の実行コールを記載してください。 – Ethilium

+0

あなたはsysname型として宣言しましたが、更新ステートメントにはテーブルが必要です。それがあなたがそのエラーを起こしている理由です。エラーは実際には「テーブル変数@dbnameを宣言する必要があります – geekzster

答えて

2

クエリのパラメータとして:

CREATE PROCEDURE UpdateSQL 
-- Add the parameters for the stored procedure here 
    @UpdateField varchar(25), 
    @UpdateValue varchar(25), 
    @FilterField varchar(25), 
    @FilterValue varchar(25), 
    @DBNAME sysname 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = ' 
UPDATE @DBNAME SET @UpdateField = @UpdateValue WHERE @FilterField = @FilterValue 
'; 
    SET @sql = REPLACE(@sql, '@DBNAME', @DBNAME); 
    SET @sql = REPLACE(@sql, '@UpdateField', @UpdateField); 
    SET @sql = REPLACE(@sql, '@FilterField', @FilterField); 

    exec sp_executesql @sql, 
         N'@UpdateField varchar(25), @FilterField varchar(25)', 
         @[email protected], @[email protected]; 
END; 

GO

+0

変数 –

+0

@DrewJackson ...テーブルとカラムの指定方法と同じ方法でサーバ、データベース、スキーマを指定することができますが、どのような "カタログ"がこのコンテキストに含まれているかわかりません(通常、「カタログ」はデータベースに関するメタデータ表を参照します)。 –

0

あなたのコードは@DBNAMEをsysnameとして宣言しますが、更新ステートメントにはテーブルが必要です。

は、私はあなたがこの記事を見てみたいかもしれないと思う:how to set table name in dynamic sql query?

また、同じ問題については、この記事会談:How should I pass a table name into a stored proc?あなたがテーブルやカラム名を指定することができないため、動的SQLを使用する必要が

+0

私の謝罪、私はテーブル名としてDBNAMEを使用していますが、呼び出し元の関数からテーブル名を送信しています –

関連する問題