Gespeicherte Prozedur Variable (Code-Fehler, den ich glaube, ist da)

Ich versuche, ein Skript zu erstellen, um alle Spalten und Zeilen in SQL server aufzuräumen (ich werde mehr tun als Beschneiden, aber sobald es funktioniert, kann ich in den App-Code stecken, den ich bereits habe)

Ich denke, ich bin da, aber es scheint nicht zu aktualisieren – vielleicht ist die gespeicherte Prozedur falsch? Ich glaube, der Fehler ist hier .. – Ich habe mich um variables in gespeicherten Prozeduren herumgesucht und denke, es sieht mir richtig aus.

Insert statements for procedure here UPDATE systemUsers SET @ColumnName = @Update WHERE ID = @ID 

Volles Skript …

 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 

Gespeicherte Prozedur:

 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 

Dieser Code wird keine Fehlermeldung auslösen, weil er die Variable einfach aktualisiert. Um einen dynamischen Spaltennamen zu haben, müssen Sie dynamische SQL (oder komplizierte Case-statementen) verwenden, aber dynamisches SQL ist in diesem Fall besser.

 DECLARE @sql nvarchar(max) = ''; SET @sql = N'UPDATE systemUsers SET ' + @ColumnName + N' = ' + @Update + N' WHERE ID=' + @ID EXEC sp_executesql @sql 

Hoffe das hilft 🙂