存储过程不设置变量
Stored procedure not setting variable
我试过但不明白我的代码有什么问题。我试图在调用第二个存储过程的存储过程中设置一个变量,但据我所知,我知道变量设置不正确。谁能告诉我哪里错了
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
returns 0
所以有些地方不对。
出了什么问题,为什么我的变量没有设置? SQL 服务器版本为 15.0.4102.2
使用输出参数从存储过程传递标量值。唯一有点棘手的部分是在动态 SQL.
中设置参数
EG
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
我试过但不明白我的代码有什么问题。我试图在调用第二个存储过程的存储过程中设置一个变量,但据我所知,我知道变量设置不正确。谁能告诉我哪里错了
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
returns 0
所以有些地方不对。
出了什么问题,为什么我的变量没有设置? SQL 服务器版本为 15.0.4102.2
使用输出参数从存储过程传递标量值。唯一有点棘手的部分是在动态 SQL.
中设置参数EG
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