3

我需要在 Web 应用程序上编写查询引擎,需要完成的是用户可以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 替换FROMINTO NewTable FROM.

查询可以包含多个连接。

我应该用 SQL 还是 C# 来控制它?

4

3 回答 3

2

我在 2005 环境中遇到了类似的问题。如果将 Select 查询保存到表中,并使用以下内置过程执行查询:

EXECUTE sp_executesql @Query

这是 MS 文档:http: //msdn.microsoft.com/en-us/library/ms188001%28v=sql.90%29.aspx

编辑

牢记这一点,可以获取 SQL 转储和创建 OpenRowset 查询以获取 SQL 并将它们转储到 TempTable 中,并在需要时从 Temp 表转储到永久表。

我创建了以下 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 带到物理表。

这里有一些关于 OpenRowset 的文档。

于 2013-07-27T20:11:53.733 回答
1

您无法保证from查询中的第一个将接受into,因为您可以在select语句中有一个子选择。此外,您也可以有一个这样的字段名称datefrom

但是,假设你有“简单”的 SQL 语句,你可以这样做:

select stuff(@query, charindex('from ', @query), 0, 'into '+@Table+' ')
from t;

编辑:

以下是您真正想做的事情:

select *
into @Table
from (@query) q;

使用子查询解决了这个问题。

于 2013-07-27T11:51:34.720 回答
1

这是一个众所周知的问题。字符串连接通常是一个糟糕/有限的解决方案。更推荐的解决方案是让一些其他机制返回结果集(openquery 等),然后将其插入到表中。

例如:

SELECT *
INTO YourTable
FROM OPENQUERY([LinkedServer],your query...)
于 2013-07-27T17:20:26.417 回答