【问题标题】:How to get return value from EXEC sp_executesql如何从 EXEC sp_executesql 获取返回值
【发布时间】:2015-10-07 18:36:50
【问题描述】:

如何从 EXEC sp_executesql @OpenQry 获取返回值,以便检查该值是否存在于 IF EXISTS 中?

DECLARE @TableName VARCHAR(25)
DECLARE @TD_QUERY NVARCHAR(MAX)

DECLARE CUR_QRY CURSOR FOR
SELECT TABLENAME FROM dbo.tbl_table

OPEN CUR_QRY
FETCH NEXT FROM CUR_QRY INTO @TableName

WHILE @@FETCH_STATUS = 0 
BEGIN

SET  @OpenQry = 'SELECT * FROM OPENQUERY(linkedserver,''SELECT TABLENAME FROM DBC.TABLES WHERE TABLEKIND=''''T'''' AND DATABASENAME=''''dbname'''' AND TABLENAME=''''' + @TableName + ''''''')'

EXEC sp_executesql @OpenQry

IF EXISTS (SELECT @OpenQry)
AND EXISTS (SELECT TableName FROM dbo.table WHERE TableName=@TableName)

FETCH NEXT FROM CUR_QRY INTO @TableName
END
CLOSE CUR_QRY
DEALLOCATE CUR_QRY

【问题讨论】:

  • 您必须将动态 sql 的结果放入表中(持久、临时或变量)。您是否有理由不能只查询链接服务器?这种游标方法会让你的表演失去活力。

标签: sql-server sp-executesql


【解决方案1】:

你只需要把你想要接收de返回值的变量放在sp_executesql之前

尝试 tis 代码,如果可行,请告诉我

DECLARE @TableName VARCHAR(MAX)
DECLARE @TableNameToDrop VARCHAR(MAX) --NEW
DECLARE @TD_QUERY NVARCHAR(MAX)
DECLARE @OpenQry NVARCHAR(MAX) -- Dont forget to declare this variable
declare @sqldrop nvarchar(max)


DECLARE CUR_QRY CURSOR FOR
SELECT TABLENAME FROM dbo.tbl_table

OPEN CUR_QRY
FETCH NEXT FROM CUR_QRY INTO @TableName

WHILE @@FETCH_STATUS = 0 
BEGIN

SET  @OpenQry = 'SELECT * FROM OPENQUERY(linkedserver,''SELECT TABLENAME FROM DBC.TABLES WHERE TABLEKIND=''''T'''' AND DATABASENAME=''''dbname'''' AND TABLENAME=''''' + @TableName + ''''''')'

EXEC TableNameToDrop  = sp_executesql @OpenQry

/*
IF EXISTS (SELECT @OpenQry)
AND EXISTS (SELECT TableName FROM dbo.table WHERE TableName=@TableName )
*/
--maybe you dont need check if the table name existis, jut try this

IF EXISTS (SELECT TableName FROM dbo.table WHERE TableName=@TableNameToDrop )
BEGIN
    set @sqldrop = 'drop table '+  @TableNameToDrop 
    EXEC sp_executesql @sqldrop
END

FETCH NEXT FROM CUR_QRY INTO @TableName
END
CLOSE CUR_QRY
DEALLOCATE CUR_QRY

问候

【讨论】:

  • 这行得通!那么在 IF EXISTS 中,我应该执行 IF EXISTS (SELECT @TableName) 吗?
  • 另外,如果存在,我需要执行删除表 EXEC sp_executesql N'EXEC (''DROP TABLE Dbname.''' +@TableName+ ''') AT [linkedserver];'语法似乎不正确,因为它不会删除表。你有解决办法吗?
  • 您要删除的表是否可以删除,您需要检查。
  • 嗨 angelcake 试试这个新的编辑,我为“你的魔法”添加了几行
  • 非常感谢 Andaramis!
猜你喜欢
  • 2022-08-04
  • 2023-03-12
  • 1970-01-01
  • 2013-01-07
  • 2011-04-09
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多