易语言中如何从SQL查询中返回结果?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了易语言中如何从SQL查询中返回结果?相关的知识,希望对你有一定的参考价值。
数据库中有有一个表Tshc,分别有三个字段:FSJ1 Varchar(8)、FSJ2 Varchar(8)、FSJ3 Varchar(8),现在想把在个字段的数据合到一个字段上来,并返回给易语言。
我的思路是建立 一个表变量,把三个字段的数据分别查询出来追加到表变量中,再用查询语句把表变量数据返回给易语言:
Declare @tmp Table(Fsj Varchar(8));
Insert Into @tmp SELECT FSj1 FROM TShc;
Insert Into @tmp SELECT FSj2 FROM TShc;
Insert Into @tmp SELECT FSj3 FROM TShc;
Select * From @tmp
在SQL查询管理器中正常运行,再把这几句SQL语句用在易语言中:
记录集.打开(“Declare @tmp Table(Fsj Varchar(8));Insert Into @tmp SELECT FSj1 As FSj FROM Shc;Insert Into @tmp SELECT FSj2 As FSj FROM TShc;Insert Into @tmp SELECT FSj3 As FSj FROM TShc;Select * From @tmp”,#SQL语句,)
运行没有出错信息,但是记录集.记录数量为-1,没有记录。
兄弟们出出主意,要怎么才能在易语言中正确运行。
我的思路是建立 一个表变量,把三个字段的数据分别查询出来追加到表变量中,再用查询语句把表变量数据返回给易语言:
Declare @tmp Table(Fsj Varchar(8));
Insert Into @tmp SELECT FSj1 FROM TShc;
Insert Into @tmp SELECT FSj2 FROM TShc;
Insert Into @tmp SELECT FSj3 FROM TShc;追问
兄弟还在吗?
你的回答呢?怎么没看到你的解决方案啊?
如何从查询中返回 SQL 数据类型?
【中文标题】如何从查询中返回 SQL 数据类型?【英文标题】:How do I return the SQL data types from my query? 【发布时间】:2010-12-08 18:33:36 【问题描述】:我有一个 SQL 查询,它查询我不需要也不想理解的巨大数据库(例如,数百个视图/表,其名称难以阅读,例如 CMM-CPP-FAP-ADD)。此查询的结果需要存储在临时表中以提供报告。
我需要创建临时表,但要挖掘数百个视图/表以查找此处表示的数据类型,我想知道是否有更好的方法来构建此表。
谁能告诉我如何使用任何 SQL Server 2008 工具来判断我的 SQL 2000 数据库中的源数据类型?
作为一般示例,我想从如下查询中了解:
SELECT Auth_First_Name, Auth_Last_Name, Auth_Favorite_Number
FROM Authors
我想知道的是,而不是实际结果:
Auth_First_Name is char(25)
Auth_Last_Name is char(50)
Auth_Favorite_Number is int
我对约束不感兴趣,我只是想知道数据类型。
【问题讨论】:
【参考方案1】:select * from information_schema.columns
可以让你开始。
【讨论】:
您有区分大小写的数据库吗?如果是这样,您必须使用SELECT * FROM INFORMATION_SCHEMA.Columns
是的,它区分大小写。我尝试了 SELECT * FROM INFORMATION_SCHEMA.Columns 并得到相同的无效对象错误。这是 SQL Server 2000 (8.0.2055),这个版本中是否存在 INFORMATION_SCHEMA?
ok nvm,我尝试了 SELECT * FROM [databasename].INFORMATION_SCHEMA.COLUNMS 并且我在某个地方。感谢您在这方面对我有耐心!
如果您实际上是在尝试选择查询中返回的数据类型,这将无济于事 - 这只会评估静态表定义。 See @redcalx's answer 提供任意查询时的实际解决方案。【参考方案2】:
对于 SQL Server 2012 及更高版本:如果将查询放入字符串中,则可以获得如下结果集数据类型:
DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]';
EXEC sp_describe_first_result_set @query, null, 0;
【讨论】:
很好的答案!我在哪里可以学习另一个像这样有用的 sp_ 程序? 这是确定 AdHoc 脚本列的数据类型的金奖!之前,我使用 Select-Into,然后研究创建的新表模式。这要快得多!【参考方案3】:您还可以将结果(或前 10 个结果)插入临时表并从临时表中获取列(只要列名都不同)。
SELECT TOP 10 *
INTO #TempTable
FROM <DataSource>
然后使用:
EXEC tempdb.dbo.sp_help N'#TempTable';
或
SELECT *
FROM tempdb.sys.columns
WHERE [object_id] = OBJECT_ID(N'tempdb..#TempTable');
从Aaron's answer here推断。
【讨论】:
【参考方案4】:你也可以使用...
SQL_VARIANT_PROPERTY()
...在您无法直接访问元数据的情况下(例如,可能是链接服务器查询?)。
SQL_VARIANT_PROPERTY (Transact-SQL)在 SQL Server 2005 及更高版本中,最好使用目录视图 (sys.columns) 而不是 INFORMATION_SCHEMA。除非对其他平台的可移植性很重要。请记住,INFORMATION_SCHEMA 视图不会更改,因此它们将逐渐缺乏有关 SQL Server 后续版本中新功能等的信息。
【讨论】:
这不适用于文本字段。将抛出此异常:“操作数类型冲突:文本与 sql_variant 不兼容” @eflles 谢谢,请记住这是一个例外情况(当您无权访问元数据时),即使在 2009 年出现这个问题时,您也应该放弃text
,@ 987654324@ 和 image
。如果人们今天仍在使用它们,这只是他们问题的一小部分......【参考方案5】:
必须有更简单的方法来做到这一点......低头,瞧,有......!
“sp_describe_first_result_set”是你的朋友!
现在我确实意识到这个问题是专门针对 SQL Server 2000 提出的,但我一直在为以后的版本寻找类似的解决方案,并发现 SQL 中有一些本机支持来实现这一点。
在 SQL Server 2012 及更高版本中,请参阅。 “sp_describe_first_result_set” - Link to BOL
我已经使用类似于上述@Trisped's 的技术实现了一个解决方案,并将其剥离以实现本机 SQL Server 实现。
如果您还没有使用 SQL Server 2012 或 Azure SQL 数据库,这里是我为 2012 年以前的时代数据库创建的存储过程:
CREATE PROCEDURE [fn].[GetQueryResultMetadata]
@queryText VARCHAR(MAX)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--SET NOCOUNT ON;
PRINT @queryText;
DECLARE
@sqlToExec NVARCHAR(MAX) =
'SELECT TOP 1 * INTO #QueryMetadata FROM ('
+
@queryText
+
') T;'
+ '
SELECT
C.Name [ColumnName],
TP.Name [ColumnType],
C.max_length [MaxLength],
C.[precision] [Precision],
C.[scale] [Scale],
C.[is_nullable] IsNullable
FROM
tempdb.sys.columns C
INNER JOIN
tempdb.sys.types TP
ON
TP.system_type_id = C.system_type_id
AND
-- exclude custom types
TP.system_type_id = TP.user_type_id
WHERE
[object_id] = OBJECT_ID(N''tempdb..#QueryMetadata'');
'
EXEC sp_executesql @sqlToExec
END
【讨论】:
一个非常优雅的解决方案。【参考方案6】:SELECT COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH
FROM information_schema.columns
WHERE TABLE_NAME = 'YOUR_TABLE_NAME'
您可以使用列别名以获得更好看的输出。
【讨论】:
【参考方案7】:您能否在每次执行查询时都从头开始重新创建临时表?如果是这样,您可以使用 SELECT ... INTO
语法并让 SQL Server 担心使用正确的列类型等创建表。
SELECT *
INTO your_staging_table
FROM enormous_collection_of_views_tables_etc
【讨论】:
他还可以使用 erikkallen 指向的 information_schema 表创建该临时表以获取列数据类型。 @JM:如何一次性运行SELECT ... INTO ... FROM ... WHERE 1=0
语法来创建一个虚拟表,然后使用Management Studio 为虚拟表编写表创建SQL 脚本?
这在数据源是表值函数时非常有用,这种情况下不能使用information_schema.columns
。谢谢【参考方案8】:
这将为您提供与列属性相关的所有内容。
SELECT * INTO TMP1
FROM ( SELECT TOP 1 /* rest of your query expression here */ );
SELECT o.name AS obj_name, TYPE_NAME(c.user_type_id) AS type_name, c.*
FROM sys.objects AS o
JOIN sys.columns AS c ON o.object_id = c.object_id
WHERE o.name = 'TMP1';
DROP TABLE TMP1;
【讨论】:
这是迄今为止对原始问题最简洁的回答。【参考方案9】:sp_describe_first_result_set
将通过分析查询的第一个结果集的数据类型来帮助识别查询的数据类型
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql?view=sql-server-2017
【讨论】:
这不是一个有效的答案,因为 OP 特别声明他们有一个 SQL 2000 数据库。该程序直到 2012 年才推出。【参考方案10】:我使用一个简单的案例陈述来呈现我可以在技术规范文档中使用的结果。此示例不包含您在使用数据库时会遇到的所有条件,但它为您提供了一个很好的模板来使用。
SELECT
TABLE_NAME AS 'Table Name',
COLUMN_NAME AS 'Column Name',
CASE WHEN DATA_TYPE LIKE '%char'
THEN DATA_TYPE + '(' + CONVERT(VARCHAR, CHARACTER_MAXIMUM_LENGTH) + ')'
WHEN DATA_TYPE IN ('bit', 'int', 'smallint', 'date')
THEN DATA_TYPE
WHEN DATA_TYPE = 'datetime'
THEN DATA_TYPE + '(' + CONVERT(VARCHAR, DATETIME_PRECISION) + ')'
WHEN DATA_TYPE = 'float'
THEN DATA_TYPE
WHEN DATA_TYPE IN ('numeric', 'money')
THEN DATA_TYPE + '(' + CONVERT(VARCHAR, NUMERIC_PRECISION) + ', ' + CONVERT(VARCHAR, NUMERIC_PRECISION_RADIX) + ')'
END AS 'Data Type',
CASE WHEN IS_NULLABLE = 'NO'
THEN 'NOT NULL'
ELSE 'NULL'
END AS 'PK/LK/NOT NULL'
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY
TABLE_NAME, ORDINAL_POSITION
【讨论】:
【参考方案11】:select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='yourTable';
【讨论】:
【参考方案12】:检查数据类型。 检查 SQL Server 数据库的数据类型的第一种方法是使用 SYS 模式表进行查询。以下查询使用 COLUMNS 和 TYPES 表:
SELECT C.NAME AS COLUMN_NAME,
TYPE_NAME(C.USER_TYPE_ID) AS DATA_TYPE,
C.IS_NULLABLE,
C.MAX_LENGTH,
C.PRECISION,
C.SCALE
FROM SYS.COLUMNS C
JOIN SYS.TYPES T
ON C.USER_TYPE_ID=T.USER_TYPE_ID
WHERE C.OBJECT_ID=OBJECT_ID('your_table_name');
这样可以找到列的数据类型。
【讨论】:
【参考方案13】:这个简单的查询返回一个数据类型位。您可以将此主题用于其他数据类型:
选择 CAST(0 AS BIT) AS OK
【讨论】:
以上是关于易语言中如何从SQL查询中返回结果?的主要内容,如果未能解决你的问题,请参考以下文章