34,588
社区成员
发帖
与我相关
我的任务
分享
Undocumene
的存储过程:
EXEC sp_MSForEachTable 'if col_length(''?'',''vendorcode'') is not null EXEC(''SELECT ''''?'''' as TableName,vendorcode FROM ? where vendorcode=''''010200001'''''')'
---功能逐个表执行下面语句,?会被换成当前表,你乐意将下面的EXEC再加入insert into将结果输出到临时表
--col_length('?','vendorcode') is not null 判断该表是否有vendor code这个字段,如果有动态执行那个查询
if col_length('?','vendorcode') is not null EXEC('SELECT ''?'' as TableName,vendorcode FROM ? where vendorcode=''010200001''')
EXEC dbo.proc_GetTables 'EmployeeID','1'
CREATE PROCEDURE proc_GetTables(@columnName sysname,@value NVARCHAR(1000))
AS
BEGIN
DECLARE @T TABLE(TableName sysname);
DECLARE @Sql NVARCHAR(4000),@Result INT,@CurrentTableName sysname,@CurrentColumnName sysname;
DECLARE @t_cursor CURSOR
SET @t_cursor= CURSOR FOR
SELECT utable.name tableName,col.name columnName FROM SYS.objects utable
INNER JOIN sys.columns col ON col.object_id=utable.object_id
WHERE utable.type='u' AND col.name=@columnName;
--打开游标
BEGIN TRY
OPEN @t_cursor;
FETCH NEXT FROM @t_cursor INTO @CurrentTableName,@CurrentColumnName;
WHILE(@@FETCH_STATUS=0)
BEGIN
SET @Result=0;
SET @Sql=N'SELECT @c=COUNT(1) WHERE EXISTS(SELECT * FROM '+QUOTENAME(@CurrentTableName)+' WHERE '+QUOTENAME(@CurrentColumnName)+'=@v)';
EXEC sp_executesql @Sql,N'@c int output,@v nvarchar(1000)',@c=@Result OUTPUT,@v=@value;
IF(@Result>0)
BEGIN
INSERT INTO @T( TableName )
VALUES (@CurrentTableName)
END
FETCH NEXT FROM @t_cursor INTO @CurrentTableName,@CurrentColumnName;
END
--关闭游标
CLOSE @t_cursor;
DEALLOCATE @t_cursor;
--查询数据
SELECT * FROM @T;
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() errorMsg,ERROR_LINE() errorLine
END CATCH
END