【问题标题】:Using a Variable to Determine the Table to SELECT From使用变量确定要从中选择的表
【发布时间】:2012-01-28 19:55:09
【问题描述】:

这是我得到的新错误:

如果 object_id('Osvezi') 为空

执行 sp_executesql N'
创建过程 Osvezi
    -- 这里添加存储过程的参数
    @tablica nvarchar(200)
作为
开始
   IF @tablica = 'Uporabniki' THEN SELECT * FROM Uporabniki;

   IF @tablica = 'Dokumenti' THEN SELECT * from Dokumenti;
结尾'
去

【问题讨论】:

  • 你不能那样切换数据源。
  • 是的,我尝试过没有声明新变量,但我得到了同样的错误
  • 你应该放弃这整个想法。 SELECT * 本身就是个坏主意。将它与动态选择表相结合是一个更糟糕的主意。你想完成什么?
  • 接下来我要做的是。我正在用 c# 编写应用程序,调用 Sql server 数据库中的某个过程。作为参数,此过程正在接收其中包含表名的变量。使用该参数,我只想刷新某个表。因为我有 10 个程序,我不想刷新所有表,我只想要那些根据发送的参数而改变的程序......我希望你能理解。提前致谢
  • 太晚了,我无法正确使用语法,但请使用IF @tableName = 'Table1' THEN SELECT col1, col2 FROM Table1; IF @tableName = 'Table2' THEN SELECT col1, col2, col3 from Tabel2;`

标签: sql sql-server sql-server-2008 procedure


【解决方案1】:

你需要在字符串中使用双''来得到一个',你需要删除then

IF object_id('Osvezi') IS NULL
EXEC sp_executesql N' 
CREATE PROCEDURE Osvezi
    -- Add the parameters for the stored procedure here
    @tablica nvarchar(200)
AS
BEGIN
   IF @tablica = ''Uporabniki'' SELECT * FROM Uporabniki;

   IF @tablica = ''Dokumenti'' SELECT * from Dokumenti;
END'
GO

【讨论】:

  • 这只有在每次添加或删除表时需要更改的可能表数量才有效
  • @jclozano - 自从您提供答案后,这个问题发生了变化。我的回答修复了 OP 出错的语法。为什么投反对票?
  • 因为尽管您确实以一种不错的方式解决了问题;每次数据库的结构发生变化或者他需要向 ifs 添加一个表时,它都需要维护,这就是我建议使用 EAV 模型的主要原因,这样他就不必在每次添加或删除表时更改他的程序
  • 虽然如果@Denonth 告诉我们是否可以向他的 SP 添加或删除表会更容易
  • @jclozano 所以你对这个答案投了反对票,因为 OP 的设计很糟糕。很公平。如果我从这个问题中理解了为什么需要这样做,我可能会提供不同的答案,但由于那里根本没有任何提示,我只会解决语法错误。
【解决方案2】:

你可以这样做,但不推荐

CREATE PROCEDURE Osvezi
    -- Add the parameters for the stored procedure here
    @tablica nvarchar(200)
AS
BEGIN
    EXECUTE('SELECT * FROM' + @tablica);
END

还取决于您使用的 DBMS; SQL 服务器? MYSQL? POSTGRESQL?

编辑:

如果您需要这种灵活性,请尝试Entity-Attribute-Value Model

【讨论】:

  • 那我的回答应该有效;但正如我在回答中所说,您应该使用 EAV 模型
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多