动态存储过程更新表

时间:2019-06-12 17:37:23

标签: sql-server tsql sql-server-2012

一个应用程序开发人员要求我创建三个不同的存储过程来更新同一张表。每个存储过程都更新不同的列,并在其应用程序中的不同位置调用它们。我知道必须有一种方法可以创建一个可以完成工作的组合存储过程。

首先,我尝试使用“ switch”参数创建存储过程,该存储过程将基于switch参数更新每个存储过程中的列。

void Start()
{
    //database reference (I'm hiding the project id)
    FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://projectID.firebaseio.com/");

    // Get the root reference location of the database.
    reference = FirebaseDatabase.DefaultInstance.RootReference;

    StartCoroutine(GetUserData());
}

这可以按预期工作,但是我想知道是否有一种方法可以删除开关并使用提供的任何参数更新表。

2 个答案:

答案 0 :(得分:2)

我将使用COALESCE:返回第一个非null参数。

SET COL1 = COALESCE(@ Col1,Col1)=如果@ Col1为NULL,则获取col1的当前值。 然后,只需一次操作即可更新所有字段。

UPDATE dbo.table1
        SET col1 = COALESCE(@col1,col1), col2=COALESCE(@col2,col2), col3=COALESCE(@col3,col3), etc...
        WHERE ID = @ID

答案 1 :(得分:-1)

有一种方法可以基于交换机之间没有重叠的列进行更新的事实来模拟交换机的功能。

const styles = StyleSheet.create({
  input: {
    backgroundColor: "#222222",
    height:"10%",
  },
  container: {
    backgroundColor: "#121212",
    flexGrow: 0,
    justifyContent: "space-between",
    flexDirection:'row',
  },
  scrolltainer:{
    //height:"90%",
  },
  userMessage: {
    backgroundColor: "#c3073f",
    minWidth: "20%",
    maxWidth: "52%",
    alignSelf: 'flex-end',
    margin: "5%",
    minHeight: "5%",
    borderRadius: 11,
    borderBottomRightRadius: 1,
    marginTop: "1%",
    marginBottom: "1%",
  },
  userText: {
    margin: "8%"

  },
  topBar: {
    height:"10%",
  },
  otherMessage: {
    backgroundColor: "#b3b3b3",
    minWidth: "20%",
    maxWidth: "52%",
    alignSelf: 'flex-start',
    margin: "5%",
    minHeight: "5%",
    borderRadius: 11,
    borderBottomLeftRadius: 1,
    marginTop: "1%",
    marginBottom: "1%",
  },
  otherText: {
    margin: "8%"

  },
});