gpt4 book ai didi

sql-server - 在 sql 查询中替换第一个 FROM

转载 作者:行者123 更新时间:2023-12-04 02:50:21 26 4
gpt4 key购买 nike

我需要在网络应用程序上编写一个查询引擎,需要完成的是用户可以在文本框中输入任何 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com