考虑创建可返回一个表,并在查询中使用的功能。
https://msdn.microsoft.com/en-us/library/ms186755.aspx
一个函数和一个过程之间的主要区别在于一个函数使得不改变的任何表。它只返回一个值。
在这个例子中,我创建了一个查询来给我一个给定表中不为空或空的所有列的计数。
有可能有很多方法来清理它。但它很好地说明了一个功能。
USE Northwind
CREATE FUNCTION usp_listFields(@schema VARCHAR(50), @table VARCHAR(50))
RETURNS @query TABLE (
FieldName VARCHAR(255)
)
BEGIN
INSERT @query
SELECT
'SELECT ''' + @table+'~'+RTRIM(COLUMN_NAME)+'~''+CONVERT(VARCHAR, COUNT(*)) '+
'FROM '[email protected]+'.'[email protected]+' '+
' WHERE isnull("'+RTRIM(COLUMN_NAME)+'",'''')<>'''' UNION'
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table and TABLE_SCHEMA = @schema
RETURN
END
然后用
SELECT * FROM usp_listFields('Employees')
执行该函数产生许多像的行:
SELECT 'Employees~EmployeeID~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees WHERE isnull("EmployeeID",'')<>'' UNION
SELECT 'Employees~LastName~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees WHERE isnull("LastName",'')<>'' UNION
SELECT 'Employees~FirstName~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees WHERE isnull("FirstName",'')<>'' UNION
我建议看到[**这**](http://stackoverflow.com/questions/5604927/how-to-return-a-table-from-stored-procedure)溶液为好。人们会直觉地认为这是行不通的,但确实如此,这是最简单的方法。 – Veverke