【问题标题】:Merging two dynamic SQL statements into one将两条动态 SQL 语句合并为一条
【发布时间】:2014-10-14 14:04:55
【问题描述】:

所以我创建了一个使用动态 SQL 生成动态视图的过程,但我使用了两个 sql 执行:一个用于 if 子句,一个用于 else,应该可以将它们全部放在一个 SQL 字符串下,或者我是错误的?因为我试过了,一遍又一遍地出错。我在编写动态 sql 方面不是最好的,所以这可能是我的错误或无法完成,我在尝试这样做时浪费了时间?

create procedure test_view
  (@table_name varchar(30))
as
BEGIN
declare@ sqlQuery varchar(100)

if exists(select 1 from sp_iqview('v_anon_' + @table_name) where view_name = 'v_anon_' + @table_name)
begin
set@ sqlQuery = ('drop view ' + 'v_anon_' + @table_name)
EXECUTE(@sqlQuery)
end

else
  begin
set@ sqlQuery = ('CREATE VIEW ' + 'v_anon_' + @table_name + ' AS SeLECT * FROM ' + @table_name)
EXECUTE(@sqlQuery)
select@ sqlQuery
end
END

【问题讨论】:

  • 也许要添加一些有关该过程的内容,如果执行,她会查看您数据库中的任何表。

标签: sql tsql sap-iq


【解决方案1】:

试试这个查询....这里不需要else语句....如果对象存在,它将在第一步本身中删除。如果没有,它会创建一个新的......

create procedure test_view
  (@table_name varchar(30))
as
BEGIN
declare @DropQuery varchar(100)
declare @CreateQuery varchar(100)

IF EXISTS(select 1 from sp_iqview('v_anon_' + @table_name) where view_name = 'v_anon_'  + @table_name)
BEGIN
SET @DropQuery= 'drop view v_anon_' + @table_name
EXEC sp_executesql @DropQuery
END



SET @CreateQuery = 'CREATE VIEW  v_anon_' + @table_name + ' AS SeLECT * FROM ' + @table_name
EXEC sp_executesql @CreateQuery 
SELECT @CreateQuery 

END

【讨论】:

  • 是的,这也正是我所需要的,thx m8.... 很有趣,你看不到最简单的东西,它们却产生了如此大的不同:/
【解决方案2】:

您需要在这两个语句之间切换,但动态 SQL 不支持 GO 关键字,因为它不是有效的 T-SQL。您需要单独执行它们...

但是,您可以添加 go,然后使用我认为这里提出的解决方案...

Execute Dynamic Query with go in sql

【讨论】:

  • thx 这也很有用知道,但你不需要分开如果存在,否则用 GO,Venkat G 已经给出了我需要的解决方案,因为我只希望 sql 如果存在则执行,删除,创建一个又一个,每次,我认为我需要将所有这些放在一个字符串中(如果存在,删除,创建),但没有必要。
  • 如果不存在,则删除并创建是...指定的问题'应该可以将其全部放在一个 SQL 字符串下'...所以不确定第一个答案如何解决您的原始问题问题。但很高兴你让它工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多