【发布时间】:2014-04-19 06:22:52
【问题描述】:
我有一个存储过程,它只在特定情况下给出不同的结果。
当我从 SQL Server Management Studio 2008 R2 调用它时,它给我 0 作为输出。
当我从 C# 类文件中调用它时。它给了我 1 作为输出。
我正在使用 edmx 文件,它肯定会更新。
调用类似于以下来自 SSMS [SQL Server Management Studio]
exec proc_GetPrimaryKeyUsageCount 62, 'tblFormula'
这将输出为 0
从 C# 文件调用相同的存储过程如下所示
_db.GetPrimaryKeyUsageCount(62, "tblFormula");
这将输出为 1
存储过程是
CREATE PROCEDURE proc_GetPrimaryKeyUsageCount (
@PrimaryKeyColumnId INT
,@PrimaryKeyTable NVARCHAR(max)
--,@Response INT OUTPUT
)
AS
BEGIN
DECLARE @counter INT
DECLARE @sqlCommand NVARCHAR(max)
DECLARE @ForeignKey TABLE (
child_table VARCHAR(max)
,child_fk_column VARCHAR(max)
)
DECLARE @child_table VARCHAR(max)
DECLARE @child_fk_column VARCHAR(max)
SET @counter = 0
INSERT INTO @ForeignKey
SELECT child_table = c.TABLE_NAME
,child_fk_column = c.COLUMN_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE p
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS pc ON pc.UNIQUE_CONSTRAINT_SCHEMA = p.CONSTRAINT_SCHEMA
AND pc.UNIQUE_CONSTRAINT_NAME = p.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE c ON c.CONSTRAINT_SCHEMA = pc.CONSTRAINT_SCHEMA
AND c.CONSTRAINT_NAME = pc.CONSTRAINT_NAME
WHERE EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'IsDeleted'
AND TABLE_SCHEMA = p.TABLE_SCHEMA
AND TABLE_NAME = p.TABLE_NAME
AND p.TABLE_NAME = @PrimaryKeyTable
)
DECLARE db_cursor CURSOR
FOR
SELECT child_table
,child_fk_column
FROM @ForeignKey
OPEN db_cursor
FETCH NEXT
FROM db_cursor
INTO @child_table
,@child_fk_column
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'select count(*) from ' + CAST(@child_table AS VARCHAR) + ' where ' + CAST(@child_fk_column AS VARCHAR) + ' = ' + CAST(@PrimaryKeyColumnId AS VARCHAR)
SET @sqlCommand = 'select @cnt=count(*) from ' + CAST(@child_table AS VARCHAR) + ' where ' + CAST(@child_fk_column AS VARCHAR) + ' = ' + CAST(@PrimaryKeyColumnId AS VARCHAR)
EXEC sp_executesql @sqlCommand
,N'@cnt int OUTPUT'
,@cnt = @counter OUTPUT
IF @counter > 0
BREAK
FETCH NEXT
FROM db_cursor
INTO @child_table
,@child_fk_column
END
SELECT @counter AS [PrimaryKeyUsageCount]
END
第一个参数是主键的 ID,第二个参数是具有该主键的表的名称。
过程返回同一数据库中其他表的主键使用计数。如果它发现甚至出现 1 次,它将返回该计数,否则返回 0。
如果需要任何额外的东西,请告诉我。
【问题讨论】:
标签: c# sql entity-framework stored-procedures edmx