我試過了,但不明白我的代碼有什么問題。我試圖在呼叫第二個存盤程序的存盤程序中設定一個變數,但據我所知,我知道該變數設定不正確。誰能說我的錯誤在哪里。
CREATE PROCEDURE [dbo].[ColumnHasData]
@scheme VARCHAR(10),
@tablename VARCHAR(30),
@column VARCHAR(50)
AS
BEGIN
DECLARE @FullQuery NVARCHAR (max)=N'
IF EXISTS
(
SELECT *
FROM ' @scheme '.' @tablename '
WHERE [' @column '] IS NOT NULL
)
SELECT CAST(1 AS BIT)
ELSE
SELECT CAST(0 AS BIT)
';
EXECUTE sp_executesql @FullQuery;
END
CREATE PROCEDURE [dbo].[me_delete_column]
AS
BEGIN
Declare @noDataPresent bit
exec @noDataPresent = [different_db].[dbo].[ColumnHasData] 'int' ,'table1' ,'column1'
print @noDataPresent
RETURN
IF(@noDataPresent=0)
begin
--drop column
end
END
ColumnHasData 在一個資料庫上
me_delete_column 在第二個資料庫上
我正在嘗試設定變數@noDataPresent執行ColumnHasData
盡管我知道這個結果應該是1的print @noDataPresent回報0這么什么是錯的。
出了什么問題,為什么我的變數沒有設定?SQL Server 版本為 15.0.4102.2
uj5u.com熱心網友回復:
使用輸出引數從存盤程序傳遞標量值。唯一有點棘手的部分是在動態 SQL 中設定引數。
例如
CREATE PROCEDURE [dbo].[ColumnHasData]
@schema NVARCHAR(128),
@tablename NVARCHAR(128),
@column NVARCHAR(128),
@hasData bit output
AS
BEGIN
DECLARE @FullQuery NVARCHAR (max)=N'
IF EXISTS
(
SELECT *
FROM ' quotename(@schema) '.' quotename(@tablename) '
WHERE ' quotename(@column) ' IS NOT NULL
)
set @hasData = CAST(1 AS BIT)
ELSE
set @hasData = CAST(0 AS BIT)
';
EXECUTE sp_executesql @FullQuery, N'@hasData bit output', @hasData = @hasData output;
END
樣本資料
use tempdb
drop table if exists t
create table t(id int, a int null)
insert into t(id,a) values (1,null)
用法:
declare @hasData bit
exec ColumnHasData 'dbo','t','id', @hasData output
select @hasdata
declare @hasData bit
exec ColumnHasData 'dbo','t','a', @hasData output
select @hasdata
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/395682.html
標籤:sql sql-server 查询语句 存储过程
