0

SQL Server のすべての列と行を整理するスクリプトを作成しようとしています (トリミング以上のことを行いますが、機能したら、既に持っているアプリコードにプラグインできます)

私はそこにいると思いますが、更新されていないようです - ストアドプロシージャが間違っているのでしょうか? エラーはここにあると思います.. -- ストアド プロシージャ内の変数について調べたところ、正しいように見えます。

Insert statements for procedure here

UPDATE systemUsers 
SET @ColumnName = @Update
WHERE ID = @ID 

完全なスクリプト...

Protected Sub btnTest_Click(sender As Object, e As System.EventArgs) Handles btnTest.Click

        'Select the column names
        Dim cn As SqlConnection = New SqlConnection()
        Dim cmd As SqlCommand = New SqlCommand()
        Dim dr As SqlDataReader
        Dim i As Integer = 0
        cn.ConnectionString = ConfigurationManager.ConnectionStrings("mySQLConnectionString").ConnectionString
        cmd.Connection = cn
        ' this gets the colum name
        cmd.CommandText = "select COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'systemUsers'"

        'Open the connection to the database
        cn.Open()
        ' Execute the sql.
        dr = cmd.ExecuteReader()
        ' Read all of the rows generated by the command (in this case only one row).

        CheckBoxList1.Items.Clear() 'remove all items for the new list

        Do While dr.Read()

            i = i + 1
            Session.Item("ColumnName" & i) = dr.Item("COLUMN_NAME").ToString()
        Loop
        ' Close your connection to the DB.
        dr.Close()
        cn.Close()

        Dim j As Integer = 1
        For j = 1 to i
            cn.ConnectionString = ConfigurationManager.ConnectionStrings("mySQLConnectionString").ConnectionString
            cmd.Connection = cn
            cmd.CommandText = "Select * From [systemUsers]"

            'Open the connection to the database
            cn.Open()
            ' Execute the sql.
            dr = cmd.ExecuteReader()
            ' Read all of the rows generated by the cmd (in this case only one row).
            Dim vName As String = ""
            If vName = "ID" Then
                'skip as ID should never be edited!!
            Else

                Do While dr.Read()

                    vName = Session.Item("ColumnName" & j).ToString ' put into vName for Stored Procedure

                    Dim sConnString As String = System.Web.Configuration.WebConfigurationManager.ConnectionStrings("mySQLConnectionString").ConnectionString
                    Dim dsNames As SqlDataSource

                    dsNames = New SqlDataSource
                    dsNames.ConnectionString = sConnString
                    Dim sSQL As String
                    sSQL = "SPTidy"

                    dsNames.UpdateCommand = sSQL
                    dsNames.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure
                    dsNames.UpdateParameters.Clear()
                    dsNames.UpdateParameters.Add("ID", dr.Item("ID").ToString())
                    dsNames.UpdateParameters.Add("Update", Trim(dr.Item(vName).ToString()))
                    dsNames.UpdateParameters.Add("ColumnName", vName)
                    dsNames.Update()
                    dsNames = Nothing

                Loop
            End If

            j = j + 1

            ' Close your connection to the DB.
            dr.Close()
            cn.Close()

        Next

    End Sub

ストアド プロシージャ:

create PROCEDURE [dbo].[SPTidy] 
   @ID bigint,
   @Update nvarchar(max),
   @ColumnName nvarchar(max)
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 systemUsers 
    SET @ColumnName = @Update
    WHERE ID = @ID
END
4

1 に答える 1

1

このコードは単に変数を更新しているだけなので、エラー メッセージは表示されません。動的な列名を付けるには、動的 SQL (または複雑な case ステートメント) を使用する必要がありますが、この場合は動的 SQL の方が適しています。

DECLARE @sql nvarchar(max) = '';

SET @sql = N'UPDATE systemUsers SET ' + @ColumnName + N' = ' + @Update + N' WHERE ID=' + @ID

EXEC sp_executesql @sql

お役に立てれば :)

于 2013-10-08T14:20:31.340 に答える