使用ExecuteNonQuery运行存储过程不是';t创建我的表,但该表是在SSMS中执行sp时创建的
本文关键字:创建 SSMS sp 执行 我的 存储过程 运行 ExecuteNonQuery 使用 | 更新日期: 2023-09-27 17:59:17
一些注意事项:
ExecuteNonQuery
返回-1ExecuteNonQuery
将删除该表(@droptable
),但不会创建新表(@code
)@code
查询的长度为10265个字符- 存储过程在SSMS中运行良好,并返回表中的22行
关于为什么C#的ExecuteNonQuery
函数似乎没有执行存储过程的"exec(@code)"部分,有什么想法吗?
ALTER procedure [dbo].[sp_create_EditControlResultsPivot]
as
begin
declare @t nvarchar (250);
set @t = 'editControlResults'
declare @newtable nvarchar(250);
set @newtable = 'dbo.' + @t + 'Pivot'
declare @nonPivotColumn1 nvarchar(250);
set @nonPivotColumn1 = 'num'
declare @nonPivotColumn2 nvarchar(25);
set @nonPivotColumn2 = 'File_Name'
declare @droptable nvarchar(max);
set @droptable =
'if EXISTS (select * from sys.objects where object_id = object_id(N''' + @newtable + '''))
begin drop table ' + @newtable + ' end
'
declare @i int
set @i = 1;
declare @itemList nvarchar(max);
declare @code nvarchar(max);
while @i <= (
select COUNT(*)
from sys.columns c
left join sys.tables t on c.object_id = t.object_id
where 1=1
and c.name not like @nonPivotColumn1
and c.name not like @nonPivotColumn2
and t.name = @t
)
begin
set @itemList = @itemList + ', ' +
(
select col from
(
select c.name as col, ROW_NUMBER () over (order by c.name) as num from
sys.columns c left join sys.tables t on c.object_id = t.object_id
where 1=1
and c.name not like @nonPivotColumn1
and c.name not like @nonPivotColumn2
and t.name = @t
) sub where num = @i
)
set @i = @i + 1
end
set @itemList = (select substring(@itemList, 2, LEN(@itemList)))
set @code = '
SELECT ' + @nonpivotcolumn2 + ', Item
into ' + @newtable + '
FROM
(SELECT ' + @nonpivotcolumn2 + ', ' + @itemList + '
FROM ' + @t + ') sub
UNPIVOT
(Value FOR Item IN (' + @itemList + ')
) AS sub
where Value = ''true''
'
exec(@droptable)
exec(@code);
--print(len(@code))
END
--exec sp_create_EditControlResultsPivot
ExecuteNonQuery方法返回受影响的行数。请改用ExecuteReader方法。
SqlCommand.ExecuteReader方法
从ExecuteNonQuery返回数据的唯一方法是通过Output参数。
我怀疑你的评论#3。@code查询的长度为10265个字符。。。可能是个问题。。。我认为C#的调用将其削减到只有4000或8000个字符。。。
由于您不需要结果集,所以ExecuteNonQuery很好。
尝试的东西:
-
尝试在表中插入@code变量的内容(在过程中),看看是否得到了正确的sql。。。当从SSMS和C#调用执行时
-
如果您在步骤1中得到一个有效的sql查询(我对此表示怀疑)。。。尝试在SSMS中执行该查询,看看它是否真的有效。。。