如何从SQL Server中的存储过程生成csv输出文件

Al *_*aba 14 sql sql-server stored-procedures

是否可以从SQL Server中的存储过程生成csv文件?我创建了我的存储过程,我想将一些结果存储为csv,有人知道如何实现这一点吗?

Dev*_*art 4

此脚本在任何表结构的输出窗口中将指定表中的行导出为 CSV 格式。希望该脚本对您有所帮助 -

\n\n
DECLARE \n      @TableName SYSNAME\n    , @ObjectID INT\n\nDECLARE [tables] CURSOR READ_ONLY FAST_FORWARD LOCAL FOR \n    SELECT \n          '[' + s.name + '].[' + t.name + ']'\n        , t.[object_id]\n    FROM (\n        SELECT DISTINCT\n              t.[schema_id]\n            , t.[object_id]\n            , t.name\n        FROM sys.objects t WITH (NOWAIT)\n        JOIN sys.partitions p WITH (NOWAIT) ON p.[object_id] = t.[object_id]\n        WHERE p.[rows] > 0\n            AND t.[type] = 'U'\n    ) t\n    JOIN sys.schemas s WITH (NOWAIT) ON t.[schema_id] = s.[schema_id]\n    WHERE t.name IN ('<your table name>')\n\nOPEN [tables]\n\nFETCH NEXT FROM [tables] INTO \n      @TableName\n    , @ObjectID\n\nDECLARE \n      @SQLInsert NVARCHAR(MAX)\n    , @SQLColumns NVARCHAR(MAX)\n    , @SQLTinyColumns NVARCHAR(MAX)\n\nWHILE @@FETCH_STATUS = 0 BEGIN\n\n    SELECT \n          @SQLInsert = ''\n        , @SQLColumns = ''\n        , @SQLTinyColumns = ''\n\n    ;WITH cols AS \n    (\n        SELECT \n              c.name\n            , datetype = t.name\n            , c.column_id\n        FROM sys.columns c WITH (NOWAIT)\n        JOIN sys.types t WITH (NOWAIT) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id\n        WHERE c.[object_id] = @ObjectID\n            AND c.is_computed = 0\n            AND t.name NOT IN ('xml', 'geography', 'geometry', 'hierarchyid')\n    )\n    SELECT \n          @SQLTinyColumns = STUFF((\n            SELECT ', [' + c.name + ']'\n            FROM cols c\n            ORDER BY c.column_id\n            FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n        , @SQLColumns = STUFF((SELECT CHAR(13) +\n            CASE \n                WHEN c.datetype = 'uniqueidentifier' \n                    THEN ' + '';'' + ISNULL('''' + CAST([' + c.name + '] AS VARCHAR(MAX)) + '''', ''NULL'')' \n                WHEN c.datetype IN ('nvarchar', 'varchar', 'nchar', 'char', 'varbinary', 'binary') \n                    THEN ' + '';'' + ISNULL('''' + CAST(REPLACE([' + c.name + '], '''', '''''''') AS NVARCHAR(MAX)) + '''', ''NULL'')' \n                WHEN c.datetype = 'datetime'\n                    THEN ' + '';'' + ISNULL('''' + CONVERT(VARCHAR, [' + c.name + '], 120) + '''', ''NULL'')' \n                ELSE \n                ' + '';'' + ISNULL(CAST([' + c.name + '] AS NVARCHAR(MAX)), ''NULL'')'\n            END\n            FROM cols c\n            ORDER BY c.column_id\n            FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 10, 'CHAR(13) + '''' +')\n\n    DECLARE @SQL NVARCHAR(MAX) = '    \n    SET NOCOUNT ON;\n    DECLARE \n          @SQL NVARCHAR(MAX) = ''''\n        , @x INT = 1\n        , @count INT = (SELECT COUNT(1) FROM ' + @TableName + ')\n\n    IF EXISTS(\n        SELECT 1\n        FROM tempdb.dbo.sysobjects\n        WHERE ID = OBJECT_ID(''tempdb..#import'')\n    )\n        DROP TABLE #import;\n\n    SELECT ' + @SQLTinyColumns + ', ''RowNumber'' = ROW_NUMBER() OVER (ORDER BY ' + @SQLTinyColumns + ')\n    INTO #import\n    FROM ' + @TableName + ' \n\n    WHILE @x < @count BEGIN\n\n        SELECT @SQL = STUFF((\n        SELECT ' + @SQLColumns + ' + ''''' + '\n        FROM #import \n        WHERE RowNumber BETWEEN @x AND @x + 9\n        FOR XML PATH, TYPE, ROOT).value(''.'', ''NVARCHAR(MAX)''), 1, 1, '''')\n\n        PRINT(@SQL)\n\n        SELECT @x = @x + 10\n\n    END'\n\n    EXEC sys.sp_executesql @SQL\n\n    FETCH NEXT FROM [tables] INTO \n          @TableName\n        , @ObjectID\n\nEND\n\nCLOSE [tables]\nDEALLOCATE [tables]\n
Run Code Online (Sandbox Code Playgroud)\n\n

在输出窗口中,您将得到类似这样的内容(AdventureWorks.Person.Person):

\n\n
1;EM;0;NULL;Ken;J;S\xc3\xa1nchez;NULL;0;92C4279F-1207-48A3-8448-4636514EB7E2;2003-02-08 00:00:00\n2;EM;0;NULL;Terri;Lee;Duffy;NULL;1;D8763459-8AA8-47CC-AFF7-C9079AF79033;2002-02-24 00:00:00\n3;EM;0;NULL;Roberto;NULL;Tamburello;NULL;0;E1A2555E-0828-434B-A33B-6F38136A37DE;2001-12-05 00:00:00\n4;EM;0;NULL;Rob;NULL;Walters;NULL;0;F2D7CE06-38B3-4357-805B-F4B6B71C01FF;2001-12-29 00:00:00\n5;EM;0;Ms.;Gail;A;Erickson;NULL;0;F3A3F6B4-AE3B-430C-A754-9F2231BA6FEF;2002-01-30 00:00:00\n6;EM;0;Mr.;Jossef;H;Goldberg;NULL;0;0DEA28FD-EFFE-482A-AFD3-B7E8F199D56F;2002-02-17 00:00:00\n
Run Code Online (Sandbox Code Playgroud)\n