我需要在网络应用程序上编写一个查询引擎,需要完成的是用户可以在文本框中输入任何 SELECT
语句,然后将结果创建到一个新表中.
这是我创建的函数,但它只支持 SQL Server 2012,我想要类似于此函数,但只有它应该支持 SQL Server 2005 及更高版本:
CREATE FUNCTION [dbo].[CustomQueryTableCreation]
(
@TableName varchar(max),
@sql NVARCHAR(MAX)
)
RETURNS
@TableBuilder TABLE
(
DS varchar(max)
)
BEGIN
INSERT INTO @TableBuilder
SELECT 'CREATE TABLE dbo.' + @TableName+'(';
INSERT INTO @TableBuilder
SELECT
CASE column_ordinal
WHEN 1 THEN '' ELSE ',' END
+ name + ' ' + system_type_name + CASE is_nullable
WHEN 0 THEN ' not null' ELSE '' END
FROM
sys.dm_exec_describe_first_result_set
(
@sql, NULL, 0
) AS f
ORDER BY
column_ordinal;
INSERT INTO @TableBuilder
SELECT ');';
RETURN
END
我现在想做的是搜索我的查询并将 FIRST FROM
替换为 INTO NewTable FROM
。
查询可以包含多个连接。
我应该用 SQL 还是 C# 来控制它?
最佳答案
我在 2005 环境中遇到了类似的问题。如果将 Select 查询保存到表中,并使用以下内置过程来执行查询:
EXECUTE sp_executesql @Query
这是 MS 文档: http://msdn.microsoft.com/en-us/library/ms188001%28v=sql.90%29.aspx
编辑
牢记这一点,可以获取 SQL 转储并创建 OpenRowset 查询以获取 SQL 并将它们转储到 TempTable 中,并在需要时从临时表转储到永久表。
我创建了以下 SP 来帮助将信息获取到永久表中。 先执行具体SQL语句的程序
CREATE PROCEDURE [dbo].[spExecuteRowset]
(
@Query NVARCHAR(MAX)
)
AS
BEGIN
--Execute SQL Statement
EXECUTE sp_executesql @Query
END
然后是 OpenRowset SP:
CREATE PROCEDURE [dbo].[spCustomquery]
(
@ProQuery NVARCHAR(MAX),
@Tablename NVARCHAR(MAX)
)
AS
BEGIN
--Insert the info into a Specidied Table
DECLARE @Query NVARCHAR(max)
SET @Query = 'SELECT * INTO #MyTempTable FROM OPENROWSET(''SQLNCLI'', ''Server=localhost;Trusted_Connection=yes;'','' EXEC [YOUR DATABASE].dbo.spExecuteRowset' +''''+@ProQuery+''''') SELECT * INTO '+ @Tablename +' FROM #MyTempTable'
--FOR DEBUG ONLY!!!!
PRINT @Query
EXEC [YourDatabase].dbo.spExecuteRowset @Query
END
这会将它从#tempTable 带到物理表。
Here 是一些关于 OpenRowset 的文档。
关于sql-server - 在 sql 查询中替换第一个 FROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17897406/